检查是否安装了jdk/JRE并获取jvm.dll的路径

5

如何通过编程检查Java是否已安装并从jvm.dll获取路径?


简短而直接的回答?运行它并查看是否有效。 - DreadHeadedDeveloper
检查注册表。如果你读取注册表,你就可以知道它安装在哪里。仅适用于Windows。不确定Linux是否适用。 - Brandon
请查看Launch4jJSL,了解它们如何搜索Windows注册表以查找已安装的JVM。 - Thomas Taylor
4个回答

3

VM库文件(jvm.dll)的位置

对于Oracle的JDK,Java HotSpot客户端VM在JDK内的路径为:

  • jre/bin/client/jvm.dll(在x86上)

Java HotSpot服务器VM的路径为:

  • jre/bin/server/jvm.dll(在x86上)
  • jre/bin/server/jvm.dll(在IA64上)

Windows注册表键

Oracle、OpenJDK、Azul、IBM和其他JDK开发者可能使用各种Windows注册表键。例如,Java 11似乎使用JavaSoft\JDK键,而Java 8使用JavaSoft\Java Development Kit。像Launch4jJava Service Launcher这样的程序会搜索注册表中的JVM。

  • HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\{version}\JavaHome(Java开发工具包路径)
  • HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Plug-in\{version}\JavaHome(Java插件路径)
  • HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\{version}\JavaHome(Java运行环境路径)
  • HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JDK\{version}\JavaHome(JDK路径)

编辑

# Recursively search JAVA_HOME for jvm.dll to set JVM_FILE
FOR /R %JAVA_HOME% %f IN (*) DO IF "%~nxf"=="jvm.dll" SET JVM_FILE="%~dpnxf"

2
Java可以安装在任何地方,没有保证您应该能够看到它的位置。所以,对于您的问题,一般的答案是“不可能”,或者“你必须在整个文件系统上运行递归文件搜索来查找jvm.dll”。
但这不是您想要的。我认为,您想获取一个“默认”的Java或JVM,它将被Java工具或任何Java软件使用。
通常,您可以在$JAVA_HOME环境变量(在Windows上为%JAVA_HOME%)中找到实际的JDK或JRE安装文件夹,其中应该包含jvm.dll
如果这样做不起作用,则可能是系统配置问题,但也有可能发生。您的第二选择应该是在系统路径($PATH或在Windows上为%PATH%)中找到java.exejavaw.exe
有很多工具或Java软件会带有自己的Java/JVM实例,特别是Oracle喜欢提供它们。在这种情况下,只有通用解决方案可行。

2
您可以编写一个Java程序,打印出java.home系统变量的值。例如:
System.out.println(System.getProperty("java.home"));

然后在这个类上调用java.exe。如果Java未安装或无法运行,则进程将无法启动...但如果它启动了,它会告诉您JRE安装文件夹的路径,这是您需要找出jvm.dll所在位置的必要信息。

仍然存在Java已安装但不在您的PATH中的问题。在这种情况下,我将只报告找不到Java并要求用户提供额外输入。


1
我的主程序是C++,不是Java!! - user4054093

2
这是我完成它的代码片段,jvm dll的位置将存储在runtimeLib中。
char version[255];
char runtimeLib[255];
DWORD BufferSize = 8192;
string javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
if(RegGetValue(HKEY_LOCAL_MACHINE, javaKey.c_str(), "CurrentVersion", RRF_RT_ANY, NULL, (PVOID)&version, &BufferSize) != ERROR_SUCCESS)
    //jre not found

javaKey += "\\";
javaKey += version;
BufferSize = 8192;

if(RegGetValue(HKEY_LOCAL_MACHINE, javaKey.c_str(), "RuntimeLib", RRF_RT_ANY, NULL, (PVOID)&runtimeLib, &BufferSize) != ERROR_SUCCESS)
    //jvm.dll not found

如果(RegGetValue(HKEY_LOCAL_MACHINE, javaKey.c_str(), "RuntimeLib", RRF_RT_ANY, NULL, (PVOID)&runtimeLib, &BufferSize) != ERROR_SUCCESS) //找不到jvm.dll ...这将返回找不到jvm.dll!! - user4054093
@BestHumain2 这意味着您当前的版本在注册表中没有相应的文件夹。对于堆栈溢出来说并不是真正的问题。 - Red Alert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接