如何在Windows机器上dynamic定位jjs.exe?

我试图在Windows机器上运行Nashorn,并想提供一个简单的start.bat文件来启动它。

在Unix上,这很简单, 但在Windows上,我努力可靠地findjjs.exe的位置。

我不想告诉我的用户:哦,去findJava 8 SDK的位置,并编辑start.bat指向它的目录。

我试过了:

$其中的Java

C:\ ProgramData \ ORACLE \的Java \ javapath \的java.exe

其中也不包含jjs.exe。
JAVA_HOMEJDK_HOME默认没有设置,bin目录也不在PATH中; 所以现在看来​​我不得不依靠猜测默认位置。

还有其他的select吗?

我不认为这里有什么 绝对的傻瓜,因为有很多方法可能安装Java(例如,在一台机器上安装ZIP,并将其安装在另一台机器上)。 你不会告诉我们你的用户是如何安装的,或者你甚至可以确定他们有Java 8(这是jjs所必需的)。

但可能足够好的是假设用户实际上运行安装程序。 在这种情况下,您可以在注册表中找到Java信息。 请参阅HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8\JavaHome ,它应该为您提供最新1.8安装的Java主目录(您还可以在HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8.0_*下查找特定的发行版HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8.0_* )。

所以,例如,在我的测试机器上:

 C:\Users\IEUser>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8" /v JavaHome HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8 JavaHome REG_SZ C:\Program Files\Java\jdk1.8.0_25 

这是一个解决方案,但我不知道它有多好。 它假定已经安装了JDK。

 import java.io.File; public class FindJJS { public static void main(String[] args) { System.out.println(System.getProperty("java.home") + File.separator + "bin" + File.separator + "jjs" + (System.getProperty("os.name").startsWith("Windows") ? ".exe" : "")); } } 

编译它,把它放在lib /

在start.bat中:

 for /f "usebackq tokens=*" %%a in (`java -cp lib FindJJS`) do "%%a"-scripting bin\yourscript.jjs -- %1