18

Ant ビルド ファイルを継承しましたが、32 ビット システムと 64 ビット システムの両方にデプロイする必要があります。

Java 以外のビットは、GNUMakefiles を使用して行われます。ここでは、「uname」を呼び出して情報を取得するだけです。アリでこれを模倣する同様の、またはさらに簡単な方法はありますか?

4

7 に答える 7

12

パーティーに遅れましたが、一体何...

${os.arch} は、JVM が 32/64 ビットかどうかのみを示します。64 ビット OS で 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 ライブラリが必要です

于 2011-01-17T02:22:45.237 に答える
10

${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 です。

于 2008-10-20T16:35:40.450 に答える
7

これは、外部またはオプションのANT依存関係を必要とせずに機能する答えです(Kubuntu 64、Debian 32、Windows 2000、およびWindows XPでテストしました) 。@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>
于 2012-01-23T17:04:55.710 に答える
3

必要な値を使用してパラメーターをビルド ファイルに渡すだけです。たとえば、ターゲットが次の場合dist:

ant -Dbuild.target=32 dist

また

ant -Dbuild.target=64 dist

次に、Ant ビルド スクリプトで、プロパティの値に応じてさまざまなアクションを実行します (プロパティが設定されていない場合は、条件${build.target}を使用してプロパティのデフォルト値を設定することもできます)。

または、などの組み込みの システム プロパティの値を確認できます${os.arch}

于 2008-10-20T16:21:04.393 に答える
1

os.arch はうまく機能しません。別の方法として、JVM に問い合わせます。たとえば、次のようになります。

    ~$ java -d32 テスト
    月 6 月 04 日 07:05:00 CEST 2007
    ~$ エコー $?
    0
    ~$ Java -d64 テスト
    このプラットフォームでは、64 ビット JVM の実行はサポートされていません。
    ~$ エコー $?
    1

それはスクリプトまたはラッパーにある必要があります。

于 2008-10-20T16:25:43.933 に答える
1

ところで、64 ビット Linux 用に取得した os.arch (os タグの arch プロパティ) は amd64 でした。

于 2011-02-17T01:10:18.690 に答える
0

Java アプリケーションの構築に ANT を使用していると仮定すると、それが 32 ビット アーキテクチャか 64 ビットかを知る必要があるのはなぜですか? Ant タスクにはいつでもパラメーターを渡すことができます。よりクリーンな方法は、実際のビルドを呼び出す前に、Ant が使用するシステム プロパティ ファイルをプログラムで出力することです。この興味深い投稿http://forums.sun.com/thread.jspa?threadID=5306174があります。

于 2008-10-20T16:26:39.970 に答える