McD*_*ell 48
可以使用" os.arch "属性检索正在使用的JVM体系结构:
System.getProperty("os.arch");
Run Code Online (Sandbox Code Playgroud)
"os"部分似乎有点用词不当,或者原始设计师可能不希望JVM在他们不编写的架构上运行.返回值似乎不一致.
NetBeans安装程序团队正在解决 JVM与操作系统体系结构的问题.引用:
x64位:Java和系统
跟踪问题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,它无法使用uname参数完成,可能它可以通过创建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
Run Code Online (Sandbox Code Playgroud)
64位太阳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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
(GNU版本不报告"sun.arch.data.model"属性;可能其他JVM也没有.)
我正在使用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代码:
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
这在WinXP的各种各样的机器上运行良好,没有SP通过Vista和Win7,所有SP,32位和64位.
请注意,在我的NSIS脚本中,我正在使用现有的包来检查JVM是否已安装并首先执行此操作,因此只有在JVM安装出现严重错误的情况下才会出现默认的32位选择,在这种情况下你复制的DLL集无论如何都无关紧要.
希望这对某人有帮助.
在 Linux 上,我的 (java) 虚拟机报告 java.vm.name=Java HotSpot(TM) 64 位服务器虚拟机。System 的 javadoc 声明 System.getProperty 将始终具有此值,但在 sun.arch.data.model 上保持沉默。
不幸的是,他们没有指定系统属性是什么,因此其他一些 JVM 可能只会报告 java.vm.name=Edgar。
顺便说一句,“安装在系统上”,我假设你的意思是“当前运行的 JVM”?
| 归档时间: |
|
| 查看次数: |
67236 次 |
| 最近记录: |