5

如何可靠地找到包含 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
4

2 回答 2

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 发行版也可能需要修改代码。

更新: 经过一番谷歌搜索后,我在 oracle 文档中发现该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']
于 2012-10-20T09:46:56.313 回答
3

我喜欢文森特更有原则的回答,但这里有一个更简单的技巧:

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)。

于 2015-03-13T22:47:18.083 回答