java:windows下获取当前虚拟机(java.exe)所在路径

本文介绍如何在Java程序中获取当前Java虚拟机(JVM)的确切位置。由于java.home属性不能准确反映实际的JVM路径,文章提供了一种通过java.library.path属性来间接获取的方法,并附带了测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Properties java.lang.System.getProperties()的注释中有对”java.home”属性的说明:” Java installation directory “,很简单,就是java安装路径。
如果你要想在运行时获取当前java虚拟机所在的位置,通过System.getProperty(“java.home”)调用并不能获取准确的位置。
比如:
eclipse中将jre主目录设置为”C:\Program Files\Java\jdk1.8.0_111”,执行的jvm应该是”C:\Program Files\Java\jdk1.8.0_111\bin\java.exe”
但调用System.getProperty(“java.home”)返回的结果为”C:\Program Files\Java\jdk1.8.0_111\jre”
eclipse中将jre主目录设置为”C:\Program Files\Java\jdk1.8.0_111\jre”,执行的jvm应该是”C:\Program Files\Java\jdk1.8.0_111\jre\bin\java.exe”
但调用System.getProperty(“java.home”)返回的结果仍然是”C:\Program Files\Java\jdk1.8.0_111\jre”

也就是说”java.home”属性是一个固定的值,不会因为你执行java程序时使用的虚拟机是jre\bin\java.exe还是bin\java.exe而有什么不同。

所以java程序要想知道自己当前所在虚拟机的位置,是不能通过”java.home”属性来获取的。
因为Windows下可执行程序(.exe)搜索动态库(DLL)时首先搜索的就是它自己所在的路径,所以JVM运行时,它首先搜索的路径也就是包含java.exe的路径,所以这个路径也是”java.library.path”属性中第一个路径;
所以可以利用这个特性,通过”java.library.path”属性来间接获取jvm的位置。
下面是测试代码TestJVM.java

package testwb;

public class TestJVM {
    public static void main(String[] args) {
        String javaHome = System.getProperty("java.home");
        System.out.println(javaHome);
        final String javaLibraryPath = System.getProperty("java.library.path");
        System.out.println(javaLibraryPath);
        String jvmFolder = javaLibraryPath.substring(0, javaLibraryPath.indexOf(';'));
        System.out.println(jvmFolder);
    }
}

输出

C:\Program Files\Java\jdk1.8.0_111\jre
C:\Program Files\Java\jdk1.8.0_111\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;…(省略)
C:\Program Files\Java\jdk1.8.0_111\bin

注意
这个办法只在Windows平台下有用,在Linux下是不行的,同样上面的代码(要将indexOf(‘;’)中的’;’改成’:’号),在ubuntu下输出是

/usr/lib/jvm/java-8-openjdk-amd64/jre
/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86…(省略)
/usr/java/packages/lib/amd64

参考:
http://stackoverflow.com/questions/9006127/find-absolute-java-exe-path-programatically-from-java-code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值