2008-10-20 9 views
18

Мы унаследовали файл сборки муравьев, но теперь его нужно развернуть как на 32-битную, так и на 64-битную системы.Как определить архитектуру сборки (32 бит/64 бит) с помощью ant?

Биты, отличные от Java, выполняются с помощью GNUMakefiles, где мы просто вызываем «uname», чтобы получить информацию. Есть ли подобный или даже более простой способ имитировать это с помощью муравья?

ответ

10

вы можете получить свойства системы java (http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties()) от муравья с $ {os.arch}. другими интересными объектами могут быть os.name, os.version, sun.cpu.endian и sun.arch.data.model.

+0

Спасибо, это звучит как самый надежный подход. Попробуй это. – 2008-10-21 12:15:46

+7

Осторожно - $ {os.arch} только сообщает вам бит-версию JVM, а не платформу. См. Ответ @ phatypus. – 2011-12-18 14:24:18

+0

Полезно знать - спасибо – 2011-12-18 17:30:55

3

Вы можете просто передать параметр в файл сборки со значением, которое вы хотите. Например, если ваша цель dist:

ant -Dbuild.target=32 dist 

или

ant -Dbuild.target=64 dist 

, а затем в скрипте сборки, выполнять различные действия в зависимости от стоимости ${build.target} собственности (вы также можете использовать conditions для установите значение по умолчанию для свойства, если оно не установлено).

Или вы можете проверить значение built-insystem properties, например ${os.arch}.

0

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, но, похоже, оно не работает под окнами. – 2012-01-23 13:41:21

0

Предполагая, что вы используете ANT для создания Java-приложения, зачем вам нужно знать, является ли это 32-разрядной дугой или 64-разрядной? Мы всегда можем передавать параметры для задач ant. Более чистым способом было бы программноизменить файл свойств системы, используемый Ant, прежде чем вызывать фактическую сборку. Есть этот интересный пост http://forums.sun.com/thread.jspa?threadID=5306174.

+0

Ссылка на нить сломалась, когда Oracle заняла форумы Java. Можете ли вы найти поток и исправить ссылку? – 2011-06-24 17:11:46

11

Late к партии, но какого черта ...

$ {} os.arch только говорит вам, если виртуальная машина является 32/64bit. Возможно, вы используете 32-битную JVM на 64-битной ОС. Попробуйте это:

<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> 

EDIT: Как @GreenieMeanie отметил, это требует библиотеки муравья-вно от ant-contrib.sourceforge.net

1

BTW, os.arch (арочного свойство тег os), который я получил для 64-битного Linux, был amd64.

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> 

 Смежные вопросы

  • Нет связанных вопросов^_^