【问题标题】:How to determine build architecture (32bit / 64bit) with ant?如何用 ant 确定构建架构(32bit / 64bit)?
【发布时间】:2008-10-20 16:09:57
【问题描述】:

我们继承了一个 ant 构建文件,但现在需要部署到 32 位和 64 位系统。

非 Java 位是使用 GNUMakefiles 完成的,我们只需调用“uname”来获取信息。有没有类似甚至更简单的方法来用 ant 模拟这个?

【问题讨论】:

    标签: java ant build 64-bit


    【解决方案1】:

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

    ~$ java -d32 测试 2007 年 6 月 4 日星期一 07:05:00 CEST ~$ 回声 $? 0 ~$ java -d64 测试 此平台不支持运行 64 位 JVM。 ~$ 回声 $? 1

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

    【讨论】:

    • 它在 Linux 下对我有用,但在 Windows 下似乎不起作用。
    【解决方案2】:

    派对迟到了,但到底是怎么回事......

    ${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,它工作得很好。对此还有其他想法吗?
    • 实际上,如果我正确地阅读了他的脚本,他所依赖的事实是 ProgramFiles(x86) 环境变量在 32 位 Windows 上不存在。
    • @LuisSoeiro - 该脚本适用于我当时使用的操作系统;我现在没有 Windows 2000 或 XP 实例可供您测试。如果您在使用 PROGRAMFILES(x86) 时遇到问题,那么 PROCESSOR_ARCHITECTURE 是否存在于所有其他 MS 操作系统上?您可以随时更改脚本的 windows 部分,以便它检查目录 C:\Program Files (x86)\ 是否存在 - 如果存在则您正在运行 64 位,如果不存在则您正在运行 32 位。
    • 请注意,使用上述语法需要通过ant-contrib.sourceforge.net 的ant-contrib 库
    • 感谢 Greenie - 因为我很痛苦 - 但这完全没有上下文,因此没用 - 你怎么能运行这个?这不像我见过的任何东西看起来像某种标记。如果我需要知道什么 ant 架构,为什么我需要掌握“如何使用 ant”很多向下箭头?
    【解决方案3】:

    您可以使用 ${os.arch} 从 ant 获取 java 系统属性 (http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties())。其他感兴趣的属性可能是 os.name、os.version、sun.cpu.endian 和 sun.arch.data.model。

    【讨论】:

    • 谢谢,这听起来是最明智的做法。会试试的。
    • 小心 - ${os.arch} 只告诉你 JVM 的位数,而不是平台。请参阅@phatypus 的回答。
    【解决方案4】:

    您可以将一个参数传递到您想要的值的构建文件中。例如,如果您的目标是dist

    ant -Dbuild.target=32 dist
    

    ant -Dbuild.target=64 dist
    

    然后在您的 Ant 构建脚本中,根据 ${build.target} 属性的值采取不同的操作(如果未设置,您也可以使用 conditions 为该属性设置默认值)。

    或者,您可以查看built-insystem properties的值,例如${os.arch}

    【讨论】:

      【解决方案5】:

      这是一个有效的答案(我在 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>
      

      【讨论】:

        【解决方案6】:

        顺便说一句,我为 64 位 Linux 获得的 os.arch(os 标签的arch属性)是 amd64。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • Oracle 接管 Java 论坛时线程链接断开。你能找到线程并修复链接吗?
          猜你喜欢
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多