Как найти ресурсы в .jar на пути к классам? - PullRequest
8 голосов
/ 31 марта 2010

Если у меня есть коллекция файлов ресурсов в каталоге на моем пути к классам, я могу перечислить их, используя ClassLoader.getResources(location).

Например, если у меня есть /mydir/myresource.properties на пути к классам, я могу вызвать getResources("mydir") загрузчика классов и получить перечисление URL, содержащих myresource.properties.

Когда я упаковываю те же самые ресурсы в файл .jar, я ничего не получаю при перечислении URL-адресов при выполнении вызова. Я только заменил структуру папок на банку с этими папками (это веб-приложение, поэтому баночка входит в /WEB-INF/lib). Я также получил несколько других звонков, использующих getResourceAsStream(location), чтобы получить другие ресурсы индивидуально по имени, и все они работают нормально.

Чем отличается перечисление ресурсов, когда они находятся в .jar?


Обновление - я воспроизвел (ish) поведение вне контейнера. Следующий фрагмент кода приводит к тому, что объект dirProperties имеет ключи, установленные для имен ресурсов в пакете, но если пакет находится в .jar, возникает исключение NullPointerException во время метода Properties.load (InputStream).

Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));

Тот же код в контейнере (Tomcat 5.5) не выдает никаких исключений, но создает пустой объект Properties, когда файлы находятся в .jar.

Ответы [ 2 ]

1 голос
/ 06 декабря 2016

Хотя у меня много вопросов к вам, чтобы точно предложить решение, я могу попросить вас попробовать этот простой шаг, который поможет вам найти ресурсы. Я считаю, что загрузчик классов, который вы используете для поиска ресурсов, не может найти ресурсы. Таким образом, вы можете попробовать, как показано ниже (больше обойти):

  1. Создать простой пустой класс (например, ResourceGetter.class)
  2. Упакуйте класс вместе с другими ресурсами в JAR. Пусть этот класс будет упакован на том же уровне иерархии папок, что и другие ресурсы. Внутри JAR, например:

    / ресурсы / ResourceGetter.class

    / ресурсы / myprop.properties ....

  3. Используйте ResourceGetter.class.getClassLoader (). GetResourceAsStream () или getResources () в своем коде, где вы хотите эти файлы ресурсов.

Если вы можете получить доступ к ресурсам, вы можете найти загрузчик классов, который его загрузил, и вы сможете решить свою проблему.

0 голосов
/ 31 марта 2010
this.getClass ().getClassLoader ().getResourceAsStream(location);
...