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