getResource ("/ some.jar") возвращает ноль, хотя в getURLs () существует "some.jar" - PullRequest
1 голос
/ 28 марта 2012

В нерабочее время я отказываюсь от отладки:

Это работает:

URL[] urls = ((URLClassLoader) MyClass.class.getClassLoader()).getURLs();
    URL myURL = null;
    for (URL url : urls) {
        if (url.getPath().endsWith("some.jar")) {
            myURL = url;
    }   
}
System.out.println(myURL);

возвращает

file:/C:/Users/Me/.m2/repository/path/to/some.jar

Однако все следующие возвращаемые значения null:

MyClass.class.getClassLoader()).getResource("/some.jar");
MyClass.class.getClassLoader()).getResource("some.jar");
MyClass.class.getClassLoader()).getResource("/C:/Users/Me/.m2/repository/path/to/some.jar");
MyClass.class.getClassLoader()).getResource("/path/to/some.jar");

Как видите, я хотел бы получить банку с maven-репозиторием пользователя, не обращаясь к нему абсолютно, если возможно. Баночка находится в пути к классам, как показано getURLs()
Но как, черт возьми, я должен обратиться к нему в getResource(), чтобы получить его?

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

URLClassLoader.getURLs() возвращает URL-адреса каталогов и JAR-файлов, которые находятся в пути к классам.ClassLoader.getResource(String) ищет ресурс внутри пути к классам.Поэтому, если один из ваших JAR / каталогов в пути к классам не содержит some.jar, ожидается, что это не удастся.

Иными словами, если some.jar содержит pkg/thingy.png, то getResource("pkg/thingy.png") будет успешным.

Также обратите внимание, что getResource(String) возвращает URL-адрес ресурса ... URL-адрес, который у вас уже есть в myURL.

1 голос
/ 28 марта 2012

Я подозреваю, что вы хотите:

MyClass.class.getClassLoader().getResource("path/to/some.jar")

Обратите внимание на отсутствие начального слеша. Это при условии, что «корень» вашего загрузчика классов фактически равен repository. Трудно сказать только по URL.

Альтернативой будет использование:

MyClass.class.getResource("/path/to/some.jar")

Обратите внимание, что на этот раз является лидирующей косой чертой. По сути, загрузчики классов не имеют понятия «относительного» имени, тогда как классы имеют.

...