如何使用ant确定构建架构(32位/64位)?

18
我们继承了一个Ant构建文件,但现在需要部署到32位和64位系统。非Java部分是使用GNUMakefiles完成的,我们只需调用"uname"来获取信息。是否有类似或更简单的方法在Ant中模仿这个过程?
7个回答

12

虽然来晚了,但还是说一下...

${os.arch} 只能告诉你JVM是32位还是64位。你可能在64位操作系统上运行32位的JVM。尝试这个:

<var name ="os.bitness" value ="unknown"/>
<if>
<os family="windows"/>
<then>
    <exec dir="." executable="cmd" outputproperty="command.ouput">
        <arg line="/c SET ProgramFiles(x86)"/>
    </exec>
    <if>
        <contains string="${command.ouput}" substring="Program Files (x86)"/>
        <then>
            <var name ="os.bitness" value ="64"/>
        </then>
        <else>
            <var name ="os.bitness" value ="32"/>
        </else>
    </if>
</then>
<elseif>
    <os family="unix"/>
    <then>
        <exec dir="." executable="/bin/sh" outputproperty="command.ouput">
        <arg line="/c uname -m"/>
        </exec>
        <if>
            <contains string="${command.ouput}" substring="_64"/>
            <then>
                <var name ="os.bitness" value ="64"/>
            </then>
            <else>
                <var name ="os.bitness" value ="32"/>
            </else>
        </if>
    </then>
</elseif>
</if>

<echo>OS bitness: ${os.bitness}</echo>

编辑: 正如 @GreenieMeanie 指出的那样,这需要从 ant-contrib.sourceforge.net 获取 ant-contrib 库。


我找不到在所有版本的Windows中都适用的环境属性。例如,ProgramFiles(x86)在Windows 2000或Windows XP下不存在...对于Linux来说很好用。还有其他想法吗? - Luis Soeiro
实际上,如果我正确地阅读了他的脚本,他依赖于在32位Windows上不存在ProgramFiles(x86)环境变量这一事实。 - aDev
@LuisSoeiro - 对我当时使用的操作系统,脚本可以正常工作;现在我没有Windows 2000或XP实例可以为您测试。如果您在处理PROGRAMFILES(X86)时遇到问题,那么PROCESSOR_ARCHITECTURE在所有其他MS操作系统中是否存在?您可以随时更改脚本的Windows部分,以便检查目录C:\ Program Files(x86)\是否存在-如果存在,则运行64位,否则运行32位。 - phatypus
4
请注意,使用上述语法需要通过http://ant-contrib.sourceforge.net/获取ant-contrib库。 - GreenieMeanie
谢谢Greenie - 因为不好意思,但这是完全没有上下文的,因此毫无用处 - 你怎么能运行这个?这不像我见过的任何东西,看起来像某种标记。如果我需要知道什么是ant架构,为什么我需要掌握“如何使用ant”的知识?请多给一些解释。 - user26676

10

谢谢,这听起来是最明智的方法。我会尝试一下。 - HD.
7
注意 - ${os.arch} 只告诉您 JVM 的位数,而不是平台的位数。请参考 @phatypus 的答案。 - Dan Gravell

7
这里有一个可行的答案(我在Kubuntu 64、Debian 32、Windows 2000和Windows XP上测试过),不需要外部或可选ANT依赖项。它基于@phatypus的答案。
<project name="FindArchitecture" default="check-architecture" basedir=".">

    <!-- Properties set: unix-like (if it is unix or linux), x64 (if it is 64-bits),
         register- size (32 or 64) -->
    <target name="check-architecture" depends="check-family,check-register" >
        <echo>Register size: ${register-size}</echo>
        <echo>OS Family: ${os-family}</echo>
    </target>

    <target name="check-family" >
        <condition property="os-family" value="unix" else="windows">
            <os family="unix" />
        </condition>

        <condition property="unix">
            <os family="unix" />
        </condition>
    </target>

    <target name="check-register" depends="reg-unix,reg-windows">
    </target>

    <!-- Test under GNU/Linux -->
    <target name="reg-unix" if="unix">
        <exec dir="." executable="uname" outputproperty="result">
            <arg line="-m"/>
        </exec>

        <!-- String ends in 64 -->
        <condition property="x64">
            <matches string="${result}" pattern="^.*64$"/>
        </condition>

        <condition property="register-size" value="64" else="32">
            <isset property="x64"/>
        </condition>
    </target>

    <!-- Test under MS/Windows-->
    <target name="reg-windows" unless="unix">
        <!-- 64 bit Windows versions have the variable "ProgramFiles(x86)" -->
        <exec dir="." executable="cmd" outputproperty="result">
            <arg line="/c SET ProgramFiles(x86)"/>
        </exec>

    <!-- String ends in "Program Files (x86)" -->
        <condition property="x64">
            <matches string="${result}" pattern="^.*=.*Program Files \(x86\)"/>
        </condition>

        <condition property="register-size" value="64" else="32">
            <isset property="x64"/>
        </condition>
    </target> 
</project>

3
你可以在构建文件中传递一个参数,其值就是你想要的。例如,如果你的目标是 dist
ant -Dbuild.target=32 dist

或者

ant -Dbuild.target=64 dist

在你的Ant构建脚本中,根据${build.target}属性的值采取不同的操作(如果未设置该属性,您还可以使用条件来设置属性的默认值)。
或者,您可以检查内置系统属性的值,例如${os.arch}

1

顺便说一下,我在64位Linux上得到的os.arch(os标签的arch属性)是amd64。


1

os.arch 不太好用,另一种方法是询问 JVM,例如:

    ~$ java -d32 test
    Mon Jun 04 07:05:00 CEST 2007
    ~$ echo $?
    0
    ~$ java -d64 test
    Running a 64-bit JVM is not supported on this platform.
    ~$ echo $?
    1

这必须在脚本或包装器中实现。


1
它在Linux下对我有效,但似乎在Windows下不起作用。 - Luis Soeiro

0
假设您正在使用ANT构建Java应用程序,为什么需要知道它是32位架构还是64位?我们总是可以将参数传递给ant任务。更清晰的方法是在调用实际构建之前以编程方式发出Ant使用的系统属性文件。这里有一个有趣的帖子http://forums.sun.com/thread.jspa?threadID=5306174

当Oracle接管Java论坛时,线程链接断了。你能找到这个线程并修复链接吗? - Jim Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接