Имею JAR-архив с java-классами. Один из них использует какой-то ресурс, встроенный в тот же JAR. Чтобы загрузить этот ресурс, я использую
MyClass.class.getResourceAsStream(myResourceName);
Однако меня беспокоит одна вещь: гарантировано ли, что требуемый ресурс будет загружен из одного и того же JAR. Документация для метода getResourceAsStream () (и соответствующего метода ClassLoader) мне не совсем понятна.
Что произойдет, если где-то в пути к классам JVM перед моим JAR будет ресурс с таким же именем? Будет ли загружен этот ресурс вместо того, который встроен в мой JAR? Есть ли другой способ заменить ресурс, встроенный в JAR?




Да. Возвращается первый соответствующий ресурс, найденный на пути к классу, как и путь поиска исполняемого файла. Вот почему ресурсы часто «разделяются пространством имен», помещая их в каталоги, которые отражают структуру пакета библиотеки или приложения.
Это поведение может немного отличаться при наличии пользовательских загрузчиков классов (например, в OSGi), но для обычных приложений Java это так.
Он работает так же, как и поиск файлов классов. Поэтому сначала попробуйте загрузчик родительского класса (рекурсивно), а затем сделайте все, что делает реализация загрузчика классов, чтобы найти файлы.
Нет никакой проверки загрузчика класса непосредственного вызывающего абонента (как это делает ResourceBundle - см. Раздел 6.3 Рекомендации по безопасному кодированию Java). Однако вам нужны разрешения для открытия URL, поскольку ClassLoader.getResourceAsStream просто вызывает URL.openStream в реализации по умолчанию.
Укажите пакет. Предполагая, что вы используете com.yourcompany.file, он ДОЛЖЕН быть уникальным. (Если только кто-то НЕ ХОЧЕТ переопределить ваш файл конфигурации через путь к классам.)
Если вы хотите прочитать файл только из определенного JAR, вы можете открыть JarFile и прочитать его напрямую.