Как определить архитектуру сборки (32bit / 64bit) с помощью ant? - PullRequest
18 голосов
/ 20 октября 2008

Мы унаследовали файл сборки ant, но теперь необходимо развернуть его как на 32-битных, так и на 64-битных системах.

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

Ответы [ 7 ]

11 голосов
/ 17 января 2011

Опоздал на вечеринку, но какого черта ...

$ {os.arch} сообщает вам только о том, является ли JVM 32/64-битной. Возможно, вы используете 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 из ant-contrib.sourceforge.net

10 голосов
/ 20 октября 2008

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

7 голосов
/ 23 января 2012

Вот ответ, который работает (я тестировал на 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 голосов
/ 20 октября 2008

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

ant -Dbuild.target=32 dist

или

ant -Dbuild.target=64 dist

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

Или вы можете проверить значение встроенных системных свойств , таких как ${os.arch}.

.
1 голос
/ 17 февраля 2011

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

0 голосов
/ 20 октября 2008

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

0 голосов
/ 20 октября 2008

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

Это должно быть в сценарии или в оболочке.

...