Загрузка ресурса из любого места в пути classpath
У меня есть простое java-приложение, которое загружает файл свойств из текущего пакета.
this.getClass().getResourceAsStream("props.properties");
Это отлично работает, когда файл свойств, который я хочу, находится в текущем пакете. Тем не менее, я хочу упаковать это приложение как JAR и определить и переопределить новый файл свойств, где я его использую. Есть ли способ загрузить первый ресурс с именем "props.properties", который находится в пути к классам?
Я хочу, чтобы было легко переопределить файл свойств через командную строку:
java.exe -classpath props.properties;myJar.jar com.test.MyApp
Я не хочу распаковывать JAR и изменять файл свойств, чтобы что-то изменить. Я чувствую, что мне не хватает чего-то очевидного...
Ответы
Ответ 1
Если все остальное не удалось, вы можете использовать два разных имени файла, например props-default.properties
внутри myJar.jar
и props.properties
для переопределения в командной строке. В коде вы попробуете сначала загрузить файл props.properties
и вернуться к props-default.properties
, если он не был найден.
Ответ 2
javadoc для Class.getResourceAsStream()
документирует логику поиска:
Если имя начинается с '/'
('\u002f'
), то абсолютное имя ресурса является частью имени, следующего за '/'.
В противном случае абсолютное имя имеет следующую форму:
modified_package_name/name
Где modified_package_name
- это имя пакета этого объекта, где '/' заменен на '.'
('\u002e'
).
Иными словами, имя ресурса, переданное методу, должно выглядеть как /com/package/p2/props.properties
, если props.properties
хранится в пакете com.package.p2
вместо текущего класса.
Ответ 3
Я уверен, что слишком поздно для ответа, но это может быть интересно для гуглеров
этот небольшой помощник фрагмента кода для загрузки файла свойств из любого места в пути к классам.
ClassLoader cl = ClassLoader.getSystemClassLoader();
if (cl != null) {
URL url = cl.getResource(CONF_PROPERTIES);
if (url == null) {
url = cl.getResource("/" + CONF_PROPERTIES);
}
if (url != null) {
try {
InputStream in = url.openStream();
props = new Properties();
props.load(in);
} catch (IOException e) {
// Log the exception
} finally {
// close opened resources
}
}
}
Ответ 4
Я не уверен, но может быть: ClassLoader.getResourceAsStream()
ИЗМЕНИТЬ:
Я не думаю, что это существенно отличается от this.getClass(). getResourceAsStream() из вопроса, поскольку, как уже упоминалось, вам все равно нужно получить ClassLoader, который вы хотите использовать для загрузки ресурса.
Поскольку вы предоставляете ресурс в классе -classpath в вашем примере, он должен быть доступен из того же загрузчика классов, что и ваш "основной" класс (в JUN SUN, том sun.misc.Launcher $AppClassLoader, не уверен, что это может/меняется для других реализаций JVM).