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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐