Загрузка файла внешних свойств в каталоге для сиблинга

Следующий сценарий

./
 config/
 application.properties
 lib/
 properties-loader-0.0.1-SNAPSHOT.jar
 acme.sh

properties-loader-0.0.1-SNAPSHOT.jar - исполняемый банку с файлом манифеста. В банке есть один пакет com.acme.lab, содержащий только класс с полным именем com.acme.lab.PropertiesLoader.

Скрипт acme.sh выполняет следующую команду:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar com.acme.lab.PropertiesLoader

Я пытаюсь получить доступ к файлу свойств из класса PropertiesLoader. Я прочитал статью Smartly загружать ваши свойства, но все еще есть проблемы с доступом к файлу свойств

System.out.println(this.getClass().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("application.properties"));

System.out.println(this.getClass().getClassLoader().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("application.properties"));

try {
 System.out.println(ResourceBundle.getBundle("etc.application"));
 System.out.println(ResourceBundle.getBundle("application"));
} catch(MissingResourceException e) {
 // do nothing
}

Все эти вызовы не могут загрузить файл.

Я просто знаю, что ошибка имеет какое-то отношение к classpath, но, похоже, не может ее найти. Я создал образец проекта maven на github, который воссоздает проблему.

1 ответ

Ресурсы интерпретируются из корней классов. Что в вашем случае, когда вы запускаете свою программу следующим образом:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar

Корни

  • ./etc/application.properties
  • ./lib/properties-loader-0.0.1-SNAPSHOT.jar

Ни один из них не содержит файл application.properties (как под-ресурс). Если вы изменили свою команду следующим образом:

java -cp etc:./lib/properties-loader-0.0.1-SNAPSHOT.jar

Затем вы можете прочитать свой файл свойств в своей программе как:

Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties");

В качестве побочного примечания всегда лучше использовать полностью определенные пути в настройке пути к классу.

* РЕДАКТИРОВАТЬ *

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

mkdir props; cd props
mkdir etc; touch etc/application.properties
mkdir test; vi test/PropLoader.java

Вставьте этот контент в редактор, затем сохраните:

package test;

import java.io.InputStream;

public class PropLoader {
 public static void main(String[] args) {
 try {
 final String path;
 if(args.length == 1) path = args[0].trim();
 else path = "etc/application.properties";

 final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
 if(is == null) throw new RuntimeException("Failed to load " + path + " as a resource");
 else System.out.printf("Loaded resource from path: %s\n", path);
 } catch(Exception e) {
 e.printStackTrace();
 }
 }
}

И проверить:

javac test/PropLoader.java
java -cp . test.PropLoader

Результатом является Loaded resource from path: etc/application.properties.

licensed under cc by-sa 3.0 with attribution.