java在运行时确定JVM可执行文件的位置
如何在运行时获取当前运行的JVM的可执行文件的位置?我想使用ProcessBuilder类将另一个JVM实例化为子流程
我知道有java.home
系统属性,但它没有指定JVM可执行文件的位置。我知道我可以这样做来获得路径:
System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"
此代码不是独立于平台的,因为Windows可执行文件的名称是java.exe
,而不是java
。有没有一种方法可以获得考虑到平台特性的JVM可执行文件的路径
# 1 楼答案
本文对这个问题进行了有趣的讨论,涉及多个平台: Finding current executable's path without /proc/self/exe
鉴于上述讨论,如果您真的需要,应该可以编写一些JNI包装器,以#ifdef作为当前平台,并进行适当的本机调用
如果您只在Linux上,“/proc/self/exe”是指向正在运行的实际可执行文件的符号链接。这样做的优点是不依赖任何环境变量(即PATH或JAVA_HOME)。但正如我所说,它绝对不是独立于平台的
# 2 楼答案
您正在尝试分叉整个JVM
但是,如果您确实必须,您可以尝试直接执行
java -arguments
,因为大多数标准java安装都将java放在cli路径上# 3 楼答案
下面的代码通过使用当前^{} 的^{} 来获取当前
java
可执行文件的路径由于对命令信息的访问可能受到操作系统权限的限制,因此结果被包装在
Optional
中# 4 楼答案
你可以一直使用操作系统。检查用户是否运行Windows的名称。这将在OS X、Linux和Windows上运行
# 5 楼答案
是的,有一种方法可以获取JVM可执行文件的路径(如果存在)。将其包括在应用程序的配置中。有很多方法可以做到这一点:命令行参数——java myApp。Main/path/to/Java;属性——java-Dpath。到java=/path/to/java;等等
如果您想要真正的平台独立性,那么您的整个方案是有缺陷的,因为无法保证JVM可执行文件的存在。我可以想象一个不需要java可执行文件的JVM
如果你想要99.99%的平台独立性,那么我认为你拥有所需的工具