Проблема с Class.getResourceAsStream ()

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

MyClass.class.getResourceAsStream(myResourceName);

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
619
4

Ответы 4

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

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

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

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

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

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

Другие вопросы по теме