如何可靠地找到Java的rt.jar或同等的?

时间:2012-10-20 06:15:29

标签: python classpath java

如何可靠地找到包含Java的引导类(rt.jar或等效类)的jar?我使用下面的代码,但我发现JAVA_HOME用于引用JDK而不是JRE,如果没有安装JDK,它将完全失败。

def findJRE():
    try:
        home = os.environ['JAVA_HOME']
        path = os.path.join(home, 'jre', 'lib', 'rt.jar')
        if os.path.isfile(path):
            return path

        #For macs
        path = os.path.join(home, 'bundle', 'Classes', 'classes.jar')
        if os.path.isfile(path):
            return path
    except Exception as e:
        pass

2 个答案:

答案 0 :(得分:3)

由于文件的位置和名称在平台之间有所不同,似乎没有指向它的环境变量,我想你最好的办法就是在文件系统中查找文件:

#!/usr/bin/env python
import subprocess
import re

rtjarPaths = subprocess.check_output(["locate", "rt.jar"])
paths = re.findall('^.*/jre/.*$', rtjarPaths, re.M)
print paths

vicent@deckard:~$ python findrt.py 
['/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar']

上面的代码在我的Ubuntu盒子上运行正常。它也可以轻松扩展,以便在MacOS X上运行。其他Linux发行版也可能需要调整代码。

<强>更新 经过一些谷歌搜索后,我发现in the oracle documentation rt.jar文件位于sun.boot.class.path系统属性中存储的路径中。不幸的是,我不知道如何直接从Python或命令行获取此属性,因此我只能提供以前代码的以下脏替代。

创建并编译PropertiesTest.java:

public class PropertiesTest {
    public static void main(String[] args)
        throws Exception {
        String value = System.getProperty("sun.boot.class.path");
        System.out.println(value);
    }
}

然后执行以下Python脚本:

#!/usr/bin/env python
import subprocess
import re

jrePaths = subprocess.check_output(["java", "PropertiesTest"])
rt = re.findall('(?:.*:)?(.*/(?:rt|classes)\.jar):?', jrePaths)
print rt

应该适用于Linux和MacOS X平台。在我的Ubuntu系统上,它提供了输出

['/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar']

答案 1 :(得分:3)

我喜欢Vincent's more principled answer,但这是一个更简单的黑客攻击:

java -verbose 2>/dev/null | sed -ne '1 s/\[Opened \(.*\)\]/\1/p'

将绝对路径打印到rt.jar

在Linux和Windows(Cygwin)上测试Sun Java 6和8,在OS X上测试Sun Java 6(其中rt.jar称为classes.jar)。