Question

Nous avons hérité d'un fichier de génération Ant, mais nous devons maintenant effectuer le déploiement sur les systèmes 32 bits et 64 bits.

Les bits non-Java sont réalisés avec GNUMakefiles où nous appelons simplement "uname". pour obtenir l'info. Existe-t-il un moyen similaire, voire plus simple, d'imiter cela avec une fourmi?

Était-ce utile?

La solution

vous pouvez accéder aux propriétés du système java ( http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties () ) de ant avec $ {os.arch}. os.name, os.version, sun.cpu.endian et sun.arch.data.model sont d’autres propriétés intéressantes.

Autres conseils

En retard pour la fête, mais bon sang…

$ {os.arch} vous indique uniquement si la machine virtuelle Java est 32 / 64bit. Vous exécutez peut-être la JVM 32 bits sur un système d'exploitation 64 bits. Essayez ceci:

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

MODIFIER: Comme @GreenieMeanie l'a souligné, cela nécessite la bibliothèque ant-contrib de ant-contrib.sourceforge.net

Voici une réponse qui fonctionne (j'ai testé sur Kubuntu 64, Debian 32, Windows 2000 et Windows XP) sans le besoin de dépendances ANT externes ou facultatives. C'était basé sur la réponse de @ 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<*>quot;/>
        </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>

Vous pouvez simplement passer un paramètre dans le fichier de construction avec la valeur souhaitée. Par exemple, si votre cible est dist :

ant -Dbuild.target=32 dist

ou

ant -Dbuild.target=64 dist

, puis dans votre script de génération Ant, effectuez différentes actions en fonction de la valeur de la propriété $ {build.target} (vous pouvez également utiliser condition pour définir une valeur par défaut pour la propriété si elle n'est pas définie).

Vous pouvez également vérifier la valeur de intégré propriétés système , tel que $ {os.arch} .

ENTRE, la propriété os.arch (propriété arch de la balise os) que j’ai obtenue pour Linux 64 bits était amd64.

os.arch ne fonctionne pas très bien, une autre approche consiste à demander à la machine virtuelle Java, par exemple:

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

Cela devrait être dans un script ou un wrapper.

En supposant que vous utilisiez ANT pour créer une application Java, pourquoi auriez-vous besoin de savoir s'il s'agit d'une architecture 32 bits ou 64 bits? Nous pouvons toujours passer des paramètres aux tâches ant. Une méthode plus propre consisterait à émettre par programmation le fichier de propriétés système utilisé par Ant avant d'appeler la construction réelle. Il y a cet article intéressant http://forums.sun.com/thread.jspa?threadID = 5306174 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top