我有一个javaagent jar,我使用
放在bootclasspath上Boot-Class-Path: myagent.jar
在MANIFEST.MF文件中。
我需要找到jar所在文件系统的目录。
然而,针对此here描述的方法似乎并不适用于我:
new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
在这种情况下,ProtectionDomain.getCodeSource()返回null。我想这种情况正在发生,因为jar已被放在引导类路径中。因此,我也无法通过MyClass.getClassLoader()来获取资源位置。
我正在使用Java 6.
谁能说出如何获取jar的位置?
答案 0 :(得分:9)
您可以使用System类加载器在引导类路径中查找类。例如,这个
System.out.println(ClassLoader.getSystemClassLoader().getResource("java/lang/String.class"));
将打印出类似的内容,
jar:file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/rt.jar!/java/lang/String.class
要在磁盘上找到MyClass.class的位置,请执行
String urlString = ClassLoader.getSystemClassLoader().getResource("com/my/package/MyClass.class").toString();
urlString = urlString.substring(urlString.indexOf("file:"), urlString.indexOf('!'));
URL url = new URL(urlString);
File file = new File(url.toURI());
System.out.println(file);
System.out.println(file.exists());
答案 1 :(得分:0)
你可以这样做:
final String bootClassPath;
final String[] entries;
// different VM may use a different string here...
bootClassPath = System.getProperty("sun.boot.class.path");
entries = bootClassPath.split(File.pathSeparator);
for(final String entry : entries)
{
System.out.println(entry);
}
通过引导类路径中的每个条目。然后,您可以为每个条目获取JAR文件并查看清单文件,看看它是否属于您自己。您可以在清单中添加另一个条目,以查找是否还没有找到的唯一内容。