2009-04-30 9 views

Respuesta

0

En Linux, my (java) vm informa java.vm.name = Java HotSpot (TM) 64-Bit Server VM. Los javadocs para System declaran que System.getProperty siempre tendrá un valor para esto, pero que son silenciosos en sun.arch.data.model.

Desafortunadamente no especifican cuál será la propiedad del sistema, por lo que algunas otras JVM pueden informar java.vm.name = Edgar.

BTW, por "instalado en el sistema", supongo que quiere decir "la JVM actual en ejecución"?

45

La arquitectura JVM en uso puede ser recuperada mediante el "os.arch" propiedad:

System.getProperty("os.arch"); 

La parte "OS" parece ser un poco de un término equivocado, o tal vez los diseñadores originales no esperaban que las JVM a estar corriendo en arquitecturas para las cuales no fueron escritos. Los valores de devolución parecen ser inconsistent.

El equipo de instalación de NetBeans es tackling the issue de la arquitectura JVM vs OS. Cita:

x64 bits: Java y Sistema

seguimiento como el Issue 143434.

Actualmente utilizando el bit x64 de JVM para determinar si el sistema (y por lo tanto Platform.getHardwareArch()) es de 64 bits o no. Esto definitivamente es incorrecto ya que es posible ejecutar 32bit JVM en el sistema de 64 bits. Deberíamos encontrar una solución para comprobar OS real de 64 bits en caso de ejecución en JVM de 32 bits.

  • para Windows que se puede hacer utilizando WindowsRegistry.IsWow64Process()
  • para Linux - comprobando 'uname -m/-p' == x86_64
  • para Solaris se puede hacer usando, por ejemplo, 'Isainfo -b'
  • para Mac OS X no puede hacerse utilizando argumentos uname, probablemente se puede resueltos mediante la creación de 64-bit binario y ejecutar en la plataforma ... (por desgracia, esto no significa :(trabajo he creado binaria únicamente con x86_64 y el arco ppc64 y fue ejecutado el éxito tigre ..)
  • de apoyo Unix genérico - no está claro, así ... probablemente comprobar para el mismo 'uname -m/-p'/'getconf LONG_BIT' y comparándolo con algunos posibles valores de 64 bits (x86_64, x64, amd64, ia64).

propiedades de la muestra de diferentes JVM todo que se ejecuta en 64 bits Ubuntu 8.0.4:

de 32 bits de IBM 1.5:

java.vendor=IBM Corporation 
java.vendor.url=http://www.ibm.com/ 
java.version=1.5.0 
java.vm.info=J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20061001 (JIT enabled) 
J9VM - 20060915_08260_lHdSMR 
JIT - 20060908_1811_r8 
GC - 20060906_AA 
java.vm.name=IBM J9 VM 
java.vm.specification.name=Java Virtual Machine Specification 
java.vm.specification.vendor=Sun Microsystems Inc. 
java.vm.specification.version=1.0 
java.vm.vendor=IBM Corporation 
java.vm.version=2.3 
os.arch=x86 
os.name=Linux 
os.version=2.6.24-23-generic 
sun.arch.data.model=32 

64 bits Sun 1.6:

java.vendor=Sun Microsystems Inc. 
java.vendor.url=http://java.sun.com/ 
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi 
java.version=1.6.0_05 
java.vm.info=mixed mode 
java.vm.name=Java HotSpot(TM) 64-Bit Server VM 
java.vm.specification.name=Java Virtual Machine Specification 
java.vm.specification.vendor=Sun Microsystems Inc. 
java.vm.specification.version=1.0 
java.vm.vendor=Sun Microsystems Inc. 
java.vm.version=10.0-b19 
os.arch=amd64 
os.name=Linux 
os.version=2.6.24-23-generic 
sun.arch.data.model=64 

64 bits GNU 1.5:

java.vendor=Free Software Foundation, Inc. 
java.vendor.url=http://gcc.gnu.org/java/ 
java.version=1.5.0 
java.vm.info=GNU libgcj 4.2.4 (Ubuntu 4.2.4-1ubuntu3) 
java.vm.name=GNU libgcj 
java.vm.specification.name=Java(tm) Virtual Machine Specification 
java.vm.specification.vendor=Sun Microsystems Inc. 
java.vm.specification.version=1.0 
java.vm.vendor=Free Software Foundation, Inc. 
java.vm.version=4.2.4 (Ubuntu 4.2.4-1ubuntu3) 
os.arch=x86_64 
os.name=Linux 
os.version=2.6.24-23-generic 

(La versión de GNU no informa del "sol. propiedad arch.data.model "; presumiblemente otras JVM tampoco).

0

Puede haber JVM de 32 bits y de 64 bits disponibles en el sistema, y ​​muchos de ellos.

Si ya tiene dll's para cada plataforma compatible, considere crear un pequeño archivo ejecutable que se vincule y ejecute para que pueda probar si la plataforma admite una funcionalidad determinada. Si se ejecutan los enlaces ejecutables, puede instalar las bibliotecas compartidas correspondientes.

-5

El siguiente código comprueba el campo machineType en todas las ventanas ejecutables para determinar si se trata de 32 o 64 bits:

public class ExeDetect 
{ 
    public static void main(String[] args) throws Exception { 
    File x64 = new File("C:/Program Files/Java/jre1.6.0_04/bin/java.exe"); 
    File x86 = new File("C:/Program Files (x86)/Java/jre1.6.0/bin/java.exe"); 
    System.out.println(is64Bit(x64)); 
    System.out.println(is64Bit(x86)); 
    } 

    public static boolean is64Bit(File exe) throws IOException { 
    InputStream is = new FileInputStream(exe); 
    int magic = is.read() | is.read() << 8; 
    if(magic != 0x5A4D) 
     throw new IOException("Invalid Exe"); 
    for(int i = 0; i < 58; i++) is.read(); // skip until pe offset 
    int address = is.read() | is.read() << 8 | 
     is.read() << 16 | is.read() << 24; 
    for(int i = 0; i < address - 60; i++) is.read(); // skip until pe header+4 
    int machineType = is.read() | is.read() << 8; 
    return machineType == 0x8664; 
    } 
} 

Tenga en cuenta que el código ha sido compactado por razones de brevedad ...

+1

nota de que el código se rompe tan pronto como el usuario doesn No use la misma versión de jre ... –

+2

-1 Método terrible. Sin plataforma cruzada Versión codificada – Tomas

+1

Este es un método genérico para detectar un ejecutable de 64 bits en Windows. Nada específico para la versión jre. –

2
import sun.misc.*; 

import java.lang.reflect.*; 

public class UnsafeTest { 
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 
    Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); 
    unsafeField.setAccessible(true); 
    Unsafe unsafe = (Unsafe) unsafeField.get(null); 
    System.out.println(unsafe.addressSize()); 
    } 
} 
6

Estoy usando NSIS y Launch4j para envolver una aplicación Java Desktop. Así que no solo necesito detectar cualquier JRE, sino también el que Launch4j encontrará con su algoritmo de búsqueda. El único enfoque que tiene sentido es ejecutar un programa corto de Java dentro del instalador de NSIS. Aquí está el Java:

 

    public class DetectJVM { 
     private static final String keys [] = { 
      "sun.arch.data.model", 
      "com.ibm.vm.bitmode", 
      "os.arch", 
     }; 
     public static void main (String [] args) { 
      boolean print = args.length > 0 && "-print".equals(args[0]); 
      for (String key : keys) { 
       String property = System.getProperty(key); 
       if (print) System.out.println(key + "=" + property); 
       if (property != null) { 
        int errCode = (property.indexOf("64") >= 0) ? 64 : 32; 
        if (print) System.out.println("err code=" + errCode); 
        System.exit(errCode); 
       } 
      } 
     } 
    } 

Envuelva esto con Launch4J. Use el tipo de encabezado GUI pero también configurado en verdadero. De lo contrario, el código de error se perderá. (Pongo todo esto en mi Netbeans Ant Creación de un script

Aquí está el código NSIS juego que lo utiliza:.

 

File ... ; unpack files including detectjvm.exe. 
ClearErrors 
ExecWait '"$INSTDIR\detectjvm.exe"' $0 
IfErrors DetectExecError 
IntCmp $0 0 DetectError DetectError DoneDetect 
DetectExecError: 
    StrCpy $0 "exec error" 
DetectError: 
    MessageBox MB_OK "Could not determine JVM architecture ($0). Assuming 32-bit." 
    Goto NotX64 
DoneDetect: 
IntCmp $0 64 X64 NotX64 NotX64 
X64: 
    File ... 64-bit AMD DLLs. 
    Goto DoneX64 
NotX64: 
    File ... 32-bit x86 DLLs. 
DoneX64: 
Delete $INSTDIR\detectjvm.exe 

Esto ha funcionado bien en un muy gran variedad de máquinas de WinXP sin SP a través de Vista y Win7 con todos los SP, 32 y 64 bits

Tenga en cuenta que en mi script NSIS estoy usando un paquete existente que comprueba si la JVM está instalada y lo hace primero, por lo que el valor predeterminado de 32 bits la selección solo ocurrirá si algo salió mal con la instalación de JVM, en cuyo caso el conjunto de archivos DLL que copie no importará de todos modos.

Espero que esto sea útil para alguien.

+0

Esta es una solución muy útil. El problema es si, ¿y si la máquina de 64 bits del usuario no está instalada con JVM? El script hará una suposición equivocada. –

+0

Tenga en cuenta que para mi caso, necesito llegar a la consola usando Launch4J. –

3

Al escribir código Java, ¿cómo distingo entre operación de 32 y 64 bits?

http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_detection

No hay API pública que le permite distinguir entre 32 y funcionamiento de 64 bits. Piense en 64 bits como una plataforma más en el escribir una vez, ejecutar en cualquier lugar de la tradición. Sin embargo, si desea escribir el código que es específico de la plataforma (la culpa es suya), la propiedad del sistema sun.arch.data.model tiene el valor "32", "64" o "desconocido".

+0

Como Thorbjørn Ravn Andersen dijo en otra publicación, las JVM de 32 bits funcionan bien en un sistema operativo de 64 bits. Utilice la propiedad sun.arch.data.model si le preocupa el ancho de bits de JVM y no el ancho de bits del sistema operativo (suponiendo que esté ejecutándose en Hot Spot JVM ...) – billsimons

+0

El problema de los bits no se debe a del código java en sí, pero debido a la envoltura, que enviamos con nuestro software. Suponiendo lo siguiente: si un cliente intenta instalar nuestra versión de 64Bit SW pero solo tiene 32Bit Java instalado; él tiene que ser informado ... – user97629

-1

Si tiene la ruta al .exe que desea verificar, puede usar this answer. Básicamente solo mira los encabezados en el archivo .exe y le dice si es 64 o 32 bits en Windows.

+0

Peter Smith respuesta es la misma lógica, pero hecho a la derecha – Massimo

-1
java -version 

Para una versión de 64 bits de Java que va a imprimir:

java version "1.8.0_92" 
Java(TM) SE Runtime Environment (build 1.8.0_92-b14) 
Java HotSpot(TM) ***64-Bit*** Server VM (build 25.92-b14, mixed mode) 

Para 32 bits que va a ser simplemente

java version "1.8.0_92" 
Java(TM) SE Runtime Environment (build 1.8.0_92-b14) 
Java HotSpot(TM) Client VM (build 25.92-b14, mixed mode) 
+0

Puede probar en la línea de comandos: java -d64 -version Si no es una versión de 64 bits, obtendrá una mensaje que se parece a: Esta instancia de Java no admite una JVM de 64 bits. Por favor instale la versión deseada. Consulte las opciones de ayuda de la JVM para obtener más información java -help – Massimo

Cuestiones relacionadas