51 votes

Comment puis-je détecter le type de JRE est installé -- vs 32 bits 64 bits

Lors de l'installation avec un programme d'installation NSIS, j'ai besoin de vérifier qui JRE (vs 32 bits 64 bits) est installé sur un système. Je sais déjà que je puisse vérifier une propriété système "sun.arch.data.model", mais c'est spécifique Sun. Je me demandais si il y a une solution standard pour cela.

50voto

McDowell Points 62645

La JVM de l'architecture en cours d'utilisation peut être récupéré à l'aide de la "os.archede la propriété":

System.getProperty("os.arch");

Les "os" partie semble être un peu un abus de langage, ou peut-être les concepteurs d'origine ne s'attendait pas Jvm être en cours d'exécution sur des architectures ils n'étaient pas écrites. Les valeurs de retour semblent être incompatibles.

NetBeans équipe de l'Installateur sont la lutte contre le problème de la JVM vs architecture des systèmes d'exploitation. Citation:

x64 bits : Java et Système

Suivi que la Question 143434.

Actuellement, nous aide x64 bits de données déterminer si le système (et donc La plate-forme.getHardwareArch()) est de 64-bit ou pas. C'est vraiment mauvais depuis il est possible d'exécuter une JVM 32 bits sur Système 64 bits. Nous devrions trouver un solution pour vérifier OS réel 64 bits en cas d'exécution sur la JVM 32 bits.

  • pour Windows, il peut être fait à l'aide de WindowsRegistry.IsWow64Process()
  • pour Linux - en cochant 'uname -m/-p' == x86_64
  • pour Solaris, il peut être fait en utilisant par exemple 'isainfo -b'
  • pour Mac O SX il peutt be done using uname arguments, probably it can be solved by creating of 64-bit binary and executing on the platform... (unfortunately, this does not work:( Ive binaire créé uniquement avec x86_64 et ppc64 arc et il a réussi exécuté sur le Tigre..)
  • Générique support Unix - il n'est pas clair... probablement la vérification pour la même 'uname -m/-p' / 'getconf LONG_BIT', et de le comparer avec certains possible les valeurs de 64 bits (x86_64, x64 amd64, ia64).


Exemple de propriétés de différents toutes les machines virtuelles en cours d'exécution sur 64 bits Ubuntu 8.0.4:

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

64bit Soleil 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

64bits 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 version GNU n'a pas rapport au soleil.arch.les données.modèle de la propriété"; probablement d'autres machines virtuelles ne sont pas non plus.)

7voto

Gene Points 20184

Je suis en utilisant INS et Launch4j pour envelopper un Java application de Bureau. J'ai donc besoin non seulement de détecter toute JRE, mais celui Launch4j trouverez avec son algorithme de recherche. La seule approche qui fait sens est de faire tourner un petit programme Java dans le programme d'installation NSIS. Voici la Java:


 public class DetectJVM {
 private static final String touches [] = {
"soleil.arch.les données.modèle",
"com.ibm.vm.bitmode",
"os.arch",
};
 public static void main (String [] args) {
 boolean print = args.longueur > 0 && "-print".equals(args[0]);
 for (String key : la clé ) {
 Propriété de chaîne = Système.getProperty(clé);
 si (imprimer) du Système..println(clé + "=" + de propriété);
 si (propriété != null) {
 int errCode = (biens.indexOf("64") >= 0) ? 64 : 32;
 si (imprimer) du Système..println("erreur code=" + errCode);
Système.sortie(errCode);
}
}
}
}

De conclure avec Launch4J. Utilisation de l'interface graphique de type en-tête, mais aussi la valeur true. Sinon, le code d'erreur sera perdu. (J'ai mis tout cela dans mon Netbeans script Ant.

Voici la correspondance des INS code qui l'utilise:


Fichier ... ; décompresser les fichiers, y compris detectjvm.exe.
ClearErrors
ExecWait '"$INSTDIR\detectjvm.exe"' $0
IfErrors DetectExecError
IntCmp $0 0 DetectError DetectError DoneDetect
DetectExecError:
 StrCpy $0 "exec erreur"
DetectError:
 MessageBox MB_OK "n'a pas Pu déterminer la JVM de l'architecture ($0). En supposant que 32 bits."
 Goto NotX64
DoneDetect:
IntCmp $0 64 X64 NotX64 NotX64
X64:
 Fichier ... AMD 64 bits Dll.
 Goto DoneX64
NotX64:
 Fichier ... 32-bit x86 Dll.
DoneX64:
Supprimer $INSTDIR\detectjvm.exe

Cela a bien fonctionné sur une très grande variété de machines à partir de WinXP avec pas de SP par Vista et Win7 avec tous les SPs, 32 - et 64-bits.

Notez que dans mon script NSIS je suis en utilisant un package existant qui vérifie pour voir si la JVM est installé et ne fait que la première, donc la valeur par défaut de 32 bits de sélection ne pourra se produire que si quelque chose se passait mal avec la JVM installer, auquel cas l'ensemble de Dll vous copie n'a pas d'importance de toute façon.

Espérons que cela est utile à quelqu'un.

4voto

billsimons Points 21

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

Lors de l'écriture de code Java, comment je fais la différence entre 32 et 64 bits?

Il n'y a pas de public API qui permet de faire la distinction entre 32 et 64 bits. Pensez à 64 bits comme une autre plate-forme de l'écrire une fois, exécuter partout tradition. Cependant, si vous souhaitez écrire du code qui est une plate-forme spécifique (honte à vous), le système de la propriété soleil.arch.les données.modèle a la valeur "32", "64", ou "inconnu".

0voto

Steve B. Points 23227

Sur linux, mon (java) vm rapports de java.vm.nom=Java HotSpot(TM) 64-Bit Server VM. La javadoc Système de déclarer que le Système.getProperty aura toujours une valeur pour cela, mais sont muets sur le soleil.arch.les données.de modèle.

Malheureusement, ils ne précisent pas ce qu'est le système de la propriété sera de sorte que certains autres JVM peut juste rapport java.vm.nom=Edgar.

BTW, par "installé sur le système", je suppose que vous voulez dire "le courant de la JVM"?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X