如果我有一个由用户启动的java jar或类文件(假设在环境变量中设置了java路径),那么如何在代码中找出java.exe / javaw.exe的绝对路径从哪个文件启动。
就像在ubuntu上一样,我们可以运行:% which java
并显示路径。
但是在Windows上,如果我检查System.getenv()
,可能会发现有多个路径,例如旧版本或新版本。如果通过cmd行,我运行java -version
它不会显示路径。
您能通过Windows上的纯java或命令行告诉我如何找到javaw.exe的位置?
答案 0 :(得分:23)
String javaHome = System.getProperty("java.home");
你能告诉我通过纯Java ...在Windows上如何找到javaw.exe的位置?
import java.io.File;
class JavawLocation {
public static void main(String[] args) {
String javaHome = System.getProperty("java.home");
File f = new File(javaHome);
f = new File(f, "bin");
f = new File(f, "javaw.exe");
System.out.println(f + " exists: " + f.exists());
}
}
C:\Program Files (x86)\Java\jdk1.6.0_29\jre\bin\javaw.exe exists: true
Press any key to continue . . .
是的,我相信这会在JRE中发挥作用。
答案 1 :(得分:2)
在Windows上,java.library.path系统属性以bin目录的路径开头,该目录包含用于运行jar文件的java.exe。
这是有道理的,因为在Windows上,任何可执行文件查找DLL文件的第一个位置是包含可执行文件本身的目录。当然,当JVM运行时,它首先查找DLL的是包含java.exe的目录。
您可以按如下方式获取java.exe的路径:
final String javaLibraryPath = System.getProperty("java.library.path");
final File javaExeFile = new File(
javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\java.exe"
);
final String javaExePath =
javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "java";
此代码是特定于Windows的 - 我对路径分隔符(;)和文件分隔符()进行了硬编码。如果库路径技巧在某种程度上不起作用,我还会将“java”作为后备。
我在Windows 7上使用Java 6和7对此进行了测试。我尝试了一个32位和64位版本的Java。
答案 2 :(得分:1)
这是我提出的稍微更通用的解决方案。也许有用:
private static String javaExe()
{
final String JAVA_HOME = System.getProperty("java.home");
final File BIN = new File(JAVA_HOME, "bin");
File exe = new File(BIN, "java");
if (!exe.exists())
{
// We might be on Windows, which needs an exe extension
exe = new File(BIN, "java.exe");
}
if (exe.exists())
{
return exe.getAbsolutePath();
}
try
{
// Just try invoking java from the system path; this of course
// assumes "java[.exe]" is /actually/ Java
final String NAKED_JAVA = "java";
new ProcessBuilder(NAKED_JAVA).start();
return NAKED_JAVA;
}
catch (IOException e)
{
return null;
}
}