【发布时间】:2008-10-20 16:09:57
【问题描述】:
我们继承了一个 ant 构建文件,但现在需要部署到 32 位和 64 位系统。
非 Java 位是使用 GNUMakefiles 完成的,我们只需调用“uname”来获取信息。有没有类似甚至更简单的方法来用 ant 模拟这个?
【问题讨论】:
我们继承了一个 ant 构建文件,但现在需要部署到 32 位和 64 位系统。
非 Java 位是使用 GNUMakefiles 完成的,我们只需调用“uname”来获取信息。有没有类似甚至更简单的方法来用 ant 模拟这个?
【问题讨论】:
os.arch 不太好用,另一种方法是询问JVM,例如:
~$ java -d32 测试 2007 年 6 月 4 日星期一 07:05:00 CEST ~$ 回声 $? 0 ~$ java -d64 测试 此平台不支持运行 64 位 JVM。 ~$ 回声 $? 1这必须在脚本或包装器中。
【讨论】:
派对迟到了,但到底是怎么回事......
${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 库
【讨论】:
您可以使用 ${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。
【讨论】:
您可以将一个参数传递到您想要的值的构建文件中。例如,如果您的目标是dist:
ant -Dbuild.target=32 dist
或
ant -Dbuild.target=64 dist
然后在您的 Ant 构建脚本中,根据 ${build.target} 属性的值采取不同的操作(如果未设置,您也可以使用 conditions 为该属性设置默认值)。
或者,您可以查看built-insystem properties的值,例如${os.arch}。
【讨论】:
这是一个有效的答案(我在 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>
【讨论】:
顺便说一句,我为 64 位 Linux 获得的 os.arch(os 标签的arch属性)是 amd64。
【讨论】:
假设您使用 ANT 构建 Java 应用程序,为什么您需要知道它是 32 位架构还是 64 位?我们总是可以将参数传递给 ant 任务。一种更简洁的方法是在调用实际构建之前以编程方式发出 Ant 使用的系统属性文件。有这个有趣的帖子http://forums.sun.com/thread.jspa?threadID=5306174。
【讨论】: