web-dev-qa-db-ja.com

どの種類のJREがインストールされているかを検出する方法-32ビットと64ビット

NSISインストーラーを使用したインストール中に、システムにインストールされているJRE(32ビットと64ビット)を確認する必要があります。システムプロパティ "Sun.Arch.data.model "ですが、これはSun固有のものです。これに対する標準的な解決策があるかどうか疑問に思っています。

49
user97629

使用中のJVMアーキテクチャは、 " os.Arch "プロパティを使用して取得できます。

System.getProperty("os.Arch");

「os」の部分は少し間違っているように見えるか、おそらく元の設計者は、JVMが記述されていないアーキテクチャで実行されることを期待していなかったようです。戻り値は 矛盾 のようです。

NetBeans Installerチームは 問題への取り組み JVM vs OSアーキテクチャです。見積もり:

x64ビット:Java and System

Issue 143434 として追跡されます。

現在、x64ビットのJVMを使用して、システム(およびPlatform.getHardwareArch())が64ビットかどうかを判断します。 64ビットシステムで32ビットJVMを実行できるため、これは間違いです。 32ビットJVMで実行する場合、OSの実際の64ビットをチェックするソリューションを見つける必要があります。

  • windowsの場合、WindowsRegistry.IsWow64Process()を使用して実行できます。
  • linuxの場合-'uname -m/-p' == x86_64をチェックすることにより
  • solarisの場合は、たとえば「isainfo -b」
  • mac OSXでは、una​​me引数を使用して行うことはできません、おそらく64ビットバイナリを作成してプラットフォームで実行することで解決できます...(残念ながら、これは機能しません:(x86_64でのみバイナリを作成しましたppc64 ArchがTigerで正常に実行されました。
  • 汎用Unixサポートの場合-明確ではありません...同じ 'uname -m/-p'/'getconf LONG_BIT'をチェックし、いくつかの可能な64ビット値(x86_64、x64、AMD64、ia64)と比較する可能性があります)。

すべて64ビットUbuntu 8.0.4で実行されているさまざまなJVMのサンプルプロパティ:

32ビット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ビット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ビット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

(GNUバージョンは「Sun.Arch.data.model」プロパティを報告しません。おそらく他のJVMも同様ではありません。)

48
McDowell

NSISとLaunch4jを使用してJavaデスクトップアプリをラップします。だから、JREを検出するだけでなく、Launch4jはその検索アルゴリズムで見つけることができます。 NSISインストーラー内で短いJavaプログラムを実行することです。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); 
} 
} 
} 
} 
 

これをLaunch4Jでラップします。 GUIヘッダータイプを使用しますが、trueに設定します。そうしないと、エラーコードが失われます。 (これらすべてをNetbeans Antビルドスクリプトに入れました。

これを使用する一致するNSISコードは次のとおりです。

 
ファイル...; 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 "JVMアーキテクチャ($ 0)を特定できませんでした。32ビットと仮定しています。" ] GoX NotX64 
 DoneDetect:
 IntCmp $ 0 64 X64 NotX64 NotX64 
 X64:
 File ... 64ビットAMD DLL。
 Goto DoneX64 
 NotX64:
 File ... 32ビットx86 DLL。
 DoneX64:
 Delete $ INSTDIR\detectjvm.exe 
 

これは、WinXPの非常に多様なマシンで、SP VistaおよびWin7、すべてのSP、32ビットおよび64ビット)で正常に機能しました。

NSISスクリプトでは、JVMがインストールされているかどうかを最初に確認する既存のパッケージを使用しているため、デフォルトの32ビット選択は、JVMのインストールで問題が発生した場合にのみ発生します。コピーするDLLのセットはとにかく重要ではありません。

これが誰かに役立つことを願っています。

7
Gene

Javaコードを書くとき、32ビット操作と64ビット操作を区別するにはどうすればよいですか?

http://www.Oracle.com/technetwork/Java/hotspotfaq-138619.html#64bit_detection

32ビット操作と64ビット操作を区別できるパブリックAPIはありません。 64ビットは、1回の書き込みで、どこでも実行できる伝統の単なる別のプラットフォームと考えてください。ただし、プラットフォーム固有のコードを作成したい場合(恥ずべきことです)、システムプロパティSun.Arch.data.modelの値は「32」、「64」、または「不明」です。

4
billsimons
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());
  }
}
1
user188716
Java -version

64ビットJavaバージョンの場合、印刷されます:

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)

32ビットの場合は、

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
user6376564

システムでは、32ビットと64ビットの両方のJVMが使用可能であり、それらの多くが使用可能です。

サポートされている各プラットフォームに既にdllがある場合-プラットフォームが特定の機能をサポートしているかどうかをテストできるように、リンクして実行する小さな実行可能ファイルを作成することを検討してください。実行可能ファイルがリンクして実行される場合、対応する共有ライブラリをインストールできます。

Linuxでは、私の(Java)vmはJava.vm.name = Java HotSpot(TM)64ビットサーバーVMを報告します。 Systemのjavadocsは、System.getPropertyには常にこの値が含まれることを宣言しますが、Sun.Arch.data.modelではサイレントです。

残念ながら、システムプロパティが何であるかを指定していないため、他のJVMがJava.vm.name = Edgarを報告するだけかもしれません。

ところで、「システムにインストール」とは、「現在実行中のJVM」を意味すると思いますか?

0
Steve B.