我正在使用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
从无XP的WinXP,到Vista的WinSP和具有32位和64位所有SP的Win7,这在许多种类的计算机上都运行良好。
请注意,在我的NSIS脚本中,我使用的是一个现有软件包,该软件包检查是否已安装JVM,并首先执行该操作,因此,只有在JVM安装出现严重错误的情况下,才发生默认的32位选择。 无论如何,复制的DLL集都无关紧要。
希望这对某人有帮助。