Class.getResourceAsStream () проблема - PullRequest
3 голосов
/ 22 января 2009

У меня есть JAR-архив с классами Java. Один из них использует некоторый ресурс, который встроен в тот же JAR. Для загрузки этого ресурса я использую

MyClass.class.getResourceAsStream(myResourceName);

Одна вещь, которая беспокоит меня, это то, гарантируется ли, что требуемый ресурс будет загружен из того же JAR. Документация для метода "getResourceAsStream ()" (и соответствующего метода ClassLoader) мне не совсем понятна.

Что бы произошло, если бы ресурс с таким же именем находился где-нибудь в пути к классам JVM перед моим JAR? Будет ли загружен этот ресурс вместо того, который встроен в мой JAR? Есть ли другой способ заменить ресурс, встроенный в JAR?

Ответы [ 4 ]

2 голосов
/ 22 января 2009

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

Это поведение может немного отличаться при наличии пользовательских загрузчиков классов (скажем, в OSGi), но для ванильных приложений Java это так.

1 голос
/ 24 января 2009

Если вы хотите прочитать файл только из определенного JAR-файла, вы можете открыть JarFile и прочитать его напрямую.

1 голос
/ 24 января 2009

Укажите пакет. Предполагая, что вы используете com.yourcompany.file, он ДОЛЖЕН быть уникальным. (Если кто-то НЕ ХОЧЕТ переопределить ваш файл конфигурации через classpath.)

1 голос
/ 22 января 2009

Работает так же, как и для поиска файлов классов. Поэтому сначала попробуйте загрузчик родительского класса (рекурсивно), затем сделайте все, что делает реализация загрузчика классов, чтобы найти файлы.

Проверка загрузчика класса непосредственного вызова не производится (как это делает ResourceBundle - см. Раздел 6.3 Руководства по безопасному кодированию Java ). Однако вам нужны разрешения для открытия URL, так как ClassLoader.getResourceAsStream просто вызывает URL.openStream в реализации по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...