如何可靠地找到包含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
答案 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
)。