Подтвердить что ты не робот

Загрузка ресурса из любого места в пути classpath

У меня есть простое java-приложение, которое загружает файл свойств из текущего пакета.

this.getClass().getResourceAsStream("props.properties");

Это отлично работает, когда файл свойств, который я хочу, находится в текущем пакете. Тем не менее, я хочу упаковать это приложение как JAR и определить и переопределить новый файл свойств, где я его использую. Есть ли способ загрузить первый ресурс с именем "props.properties", который находится в пути к классам?

Я хочу, чтобы было легко переопределить файл свойств через командную строку:

java.exe -classpath props.properties;myJar.jar com.test.MyApp

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

4b9b3361

Ответ 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).