2015-09-04 2 views
3

Я создаю банку (с Maven и Spring Boot), которая должна читать внешний файл свойств. Он должен находиться в том же каталоге запущенной банки (или в относительном пути к ней, например ./config.properties или ./conf/config.properties.Чтение внешнего файла конфигурации из jar

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

Я попытался добавить локальный реж . пути к классам (распаковка баночки я могу увидеть его в записи Class-Path), но он не работал.

Это то, что я пробовал:

InputStream in = PropertiesLoader.class.getResourceAsStream("config.properties") 
InputStream in = PropertiesLoader.class.getResourceAsStream("./config.properties") 
InputStream in = PropertiesLoader.class.getClassLoader().getResourceAsStream("./config.properties") 
InputStream in = PropertiesLoader.class.getClass().getResourceAsStream("./config.properties") 

В моей pom.xml у меня есть эта запись, чтобы добавить локальный реж к классам:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
       <mainClass>bla.bla.Main</mainClass> 
      </manifest> 
      <manifestEntries> 
       <Class-Path>.</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

Я также попытался user.dir собственности, но без Succes.

Это должно быть «легко», но я совершенно потерян.

+1

cmiiw, вы пытаетесь прочитать файл в том же каталоге с вашей банкой? если да, то я думаю, что 'new FileInputStream (" ./ file_name.txt ")' должно быть достаточно право? –

+0

Вы используете файл 'application.properties' в JAR? Является ли файл 'config.properties' за пределами JAR переопределением? – geoand

+0

@kucing_terbang hm .. У меня есть FileNotFound .. – Enrichman

ответ

0

Spring Boot может выполнять весь тяжелый подъем файлов свойств для чтения с нулевой конфигурацией. Нет необходимости вручную считывать файлы свойств. См. this часть документации для деталей.

Чтобы сделать вашу жизнь как можно проще, я предлагаю следующее (что на самом деле Spring Загрузочной стратегия по умолчанию):

Иметь application.properties файл в src/resources, который содержит значение по умолчанию для всех свойств. В среде, где будет запущена банка, укажите файл с именем application.properties либо в том же каталоге, что и в банке, либо в подкаталоге с именем config.

После того, как вы это сделаете, каждое свойство будет доступно в Spring Beans через аннотацию @Value или обработку @ConfigurationProperties.

Также обратите внимание, что вы можете назвать файл свойств нечто иное, чем application.properties до тех пор, как вы установите --spring.config.name=config когда баночка запускается, например java -jar somejar.jar --spring.config.name=config

+0

Хм, спасибо. Я уже посмотрел на него. Я не был очень рад использовать инъекции для такого, но я попробую. Таким образом, кажется, что нет способа сказать Spring Boot использовать другое имя файла (часть, чтобы сообщить ему об этом свойстве во время работы)? – Enrichman

+0

Вы также можете использовать стандартный Spring '@ PropertySource'. Однако я предлагаю придерживаться конвенций и использовать инъекцию свойств. Они упростят вашу жизнь и сделают приложение гораздо более проверенным, чтобы ручное сканирование свойств файла – geoand

0

Я попытался ниже, и она работала успешно:

Properties properties = new Properties(); 
properties.load(new FileInputStream("./test/application.properties")); 

или весенний путь

Properties properties = PropertiesLoaderUtils.loadProperties(new FileSystemResource("./test/application.properties")); 

Они оба делают тот же трюк, второй является безопасным, так что вы делаете nt необходимо закрыть входной поток.

Фокус в том, что вы должны спрятать папку test на том же уровне с помощью src, чтобы он работал с maven. Поэтому, когда у вас есть банка, вы можете создать тестовую папку и поместить в нее файл.

Протестировано также как банку.

Смежные вопросы