bootclasspath中javaagent jar的位置

时间:2011-04-20 07:29:16

标签: java classloader bytecode instrumentation javaagents

我有一个javaagent jar,我使用

放在bootclasspath上
Boot-Class-Path: myagent.jar

在MANIFEST.MF文件中。

我需要找到jar所在文件系统的目录。

然而,针对此here描述的方法似乎并不适用于我:

 new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath());

在这种情况下,ProtectionDomain.getCodeSource()返回null。我想这种情况正在发生,因为jar已被放在引导类路径中。因此,我也无法通过MyClass.getClassLoader()来获取资源位置。

我正在使用Java 6.

谁能说出如何获取jar的位置?

2 个答案:

答案 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文件并查看清单文件,看看它是否属于您自己。您可以在清单中添加另一个条目,以查找是否还没有找到的唯一内容。