如何在ANT中检测Windows操作系统

Nat*_*han 6 windows ant operating-system

我正在使用ant来编译Java应用程序.问题是一些开发者在win 7上,其他人在xp和vista上.编译的一部分是使用WIX构建一个msi,在win7上这是一个目录,在xp和vista上是另一个目录.

蚂蚁任务在Maven中控制.我正在通过一种方式告诉蚂蚁中的windows os与用于设置wix目录的条件标记之间的区别.有任何想法吗?

我知道它将采用以下格式:

<if>
   <condition property="isWin7">
    Check for windows 7
   </condition>
   <then>
    set wix path to win 7 installation
   </then>
   <else>
    set to vista/xp wix installation
   </else>
 </if>
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒.

Ric*_*ier 14

看起来ANT <condition>可以测试操作系统的名称,系列和版本:

基于该链接,我们可以查询与OS相关的一些属性.一个是family公共代码中使用的普通属性:

<!-- CHECK FOR WINDOWS FAMILY OS -->
<condition property="is_windows">
    <os family="windows"/>
</condition>
Run Code Online (Sandbox Code Playgroud)

我的ANT版本没有打印出已解析的值${os.family}.


还有:

  • os.name <---这是你需要检查的
  • os.arch
  • os.version

这是我用来演示这些属性的演示脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="build" >

    <!-- CHECK FOR WINDOWS FAMILY OS -->
    <condition property="is_windows">
        <os family="windows"/>
    </condition>

    <condition property="is_windows_7">
        <os name="Windows 7"/>
    </condition>

    <!-- DISPLAYS WINDOWS OS -->
    <target name="display_windows" if="is_windows" >
        <echo message="OS Family is:       Windows" />
    </target>


    <target name="build" >

        <antcall target="display_windows" />

        <echo message="OS Name is:         ${os.name}" />
        <echo message="OS Architecture is: ${os.arch}" />
        <echo message="OS Version is:      ${os.version}" />

    </target>

</project>
Run Code Online (Sandbox Code Playgroud)

回答这个问题后,上面的代码已经提升到我们的生产构建系统,它在Windows和Mac上提供共享功能.


@thekbb提出了一个很好的建议来删除<antcall target="display_windows" />,并display_windows根据以下代码更新目标定义:

    <target name="build" depends="display_windows">

        <echo message="OS Name is:         ${os.name}" />
        <echo message="OS Architecture is: ${os.arch}" />
        <echo message="OS Version is:      ${os.version}" />

    </target>
Run Code Online (Sandbox Code Playgroud)

这基于在antcall新JVM 中启动ant的新实例的事实.有些用户可能会发现这种优化更容易理解; 其他人可能出于性能原因想要这样做.