从java代码中以编程方式查找绝对的java.exepath

如果我有一个由用户启动的Java jar或class文件(假设javapath是在环境variables中设置的),那么我怎么能从代码中找出java.exe / javaw.exe的绝对path文件正在启动。

就像在Ubuntu上,我们可以运行: % which java ,它显示path。

然而,在Windows上,如果我检查System.getenv()它可能会发生,有多个pathfind,例如旧版本或新版本。 如果通过cmd行,我运行java -version它不显示path。

你能告诉我要么通过在Windows纯java或命令行怎么可能找出javaw.exe的位置?

Solutions Collecting From Web of "从java代码中以编程方式查找绝对的java.exepath"

 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中工作。

在Windows上,java.library.path系统属性以bin目录的路径开始,包含使用java.exe来运行jar文件的路径。

这是有道理的,因为在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。

这是我提出的稍微更一般化的解决方案。 也许有用:

 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; } }