Расположение javaagent jar в bootclasspath - PullRequest
1 голос
/ 20 апреля 2011

У меня есть javaagent jar, который я помещаю в путь начальной загрузки, используя

Boot-Class-Path: myagent.jar

внутри файла MANIFEST.MF.

Мне нужно выяснить каталог в файловой системе, в которой находится jar.

Однако метод, описанный для этого здесь , похоже, не работает для меня:

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

В этом случае ProtectionDomain.getCodeSource () возвращает ноль. Я предполагаю, что это происходит, потому что банка была помещена в путь к классу загрузки. Из-за этого я также не могу сделать MyClass.getClassLoader (), чтобы получить местоположение ресурса.

Я использую Java 6.

Может кто-нибудь сказать, как узнать местоположение банки?

Ответы [ 2 ]

9 голосов
/ 23 апреля 2011

Вы можете использовать загрузчик системных классов, чтобы найти классы в пути к загрузочному классу.Например, этот

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());
0 голосов
/ 23 апреля 2011

Вы могли бы сделать что-то вроде этого:

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, посмотреть файл манифеста и посмотреть, принадлежит ли он вам.Вы можете добавить еще одну запись в манифест для поиска, если уже нет ничего уникального для поиска.

...