Если у меня есть коллекция файлов ресурсов в каталоге на моем пути к классам, я могу перечислить их, используя 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.