2008-10-20 17 views

Respuesta

10

Puede obtener las propiedades del sistema java (http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties()) de hormiga con $ {os.arch}. otras propiedades de interés podrían ser os.name, os.version, sun.cpu.endian y sun.arch.data.model.

+0

Gracias, eso suena como el enfoque más sagrado. Intentaremos eso. –

+7

Cuidado - $ {os.arch} solo te dice la bit-ness de la JVM, no de la plataforma. Ver la respuesta de @ phatypus. –

+0

bueno saberlo - gracias –

3

Puede simplemente pasar un parámetro al archivo de compilación con el valor que desee. Por ejemplo, si su objetivo es dist:

ant -Dbuild.target=32 dist 

o

ant -Dbuild.target=64 dist 

y luego en el script de construcción Ant, tomar acciones diferentes dependiendo del valor de la propiedad ${build.target} (también se puede utilizar conditions a establecer un valor predeterminado para la propiedad si no está configurado).

O bien, puede consultar el valor de built-insystem properties, como ${os.arch}.

0

os.arch no funciona muy bien, otro enfoque está pidiendo la JVM, por ejemplo:

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

Eso tendría que estar en un script o un envoltorio.

+1

Me funcionó bajo Linux pero parece que no funciona bajo Windows. –

0

Suponiendo que está utilizando ANT para crear aplicaciones Java, ¿por qué debería saber si es un arco de 32 bits o de 64 bits? Siempre podemos pasar parámetros a las tareas de hormiga. Una forma más limpia sería emitir programáticamente el archivo de propiedades del sistema utilizado por Ant antes de llamar a la compilación real. Hay esta interesante publicación http://forums.sun.com/thread.jspa?threadID=5306174.

+0

El enlace de subproceso se rompió cuando Oracle se hizo cargo de los foros de Java. ¿Puedes encontrar el hilo y arreglar el enlace? –

11

tarde a la fiesta, pero qué diablos ...

$ {} os.arch sólo le dice si la JVM es de 32/64-bit. Es posible que esté ejecutando la JVM de 32 bits en un sistema operativo de 64 bits. Prueba esto:

<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: Como @GreenieMeanie señaló, esto requiere la biblioteca ant-contrib de ant-contrib.sourceforge.net

+0

No puedo encontrar una propiedad de entorno que funcione en todas las versiones de Windows. Por ejemplo, ProgramFiles (x86) no existe en Windows 2000 o Windows XP ... Para Linux funcionó de maravilla. ¿Alguna otra idea sobre eso? –

+0

En realidad, si estoy leyendo su script correctamente, él se basa en el hecho de que la variable de entorno ProgramFiles (x86) no existe en Windows de 32 bits. –

+0

@MikeNelson - correcto. – phatypus

1

Por cierto, el os.arch (arco de la propiedad de la etiqueta OS) que obtuve para Linux de 64 bits fue amd64.

7

Aquí hay una respuesta que funciona (probé en Kubuntu 64, Debian 32, Windows 2000 y Windows XP) sin necesidad de dependencias ANT externas u opcionales. Estaba basado en la respuesta 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$"/> 
     </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> 
+1

funciona para Windows 7 64 – Chris

Cuestiones relacionadas