2014-10-31 11 views
9

Я создаю исполняемый файл jar с maven, что означает, что вы запускаете его с помощью java -jar file.jar.Maven: добавить внешние ресурсы

Я хочу полагаться на пользовательские свойства (только файл, содержащий ключи/значения), во время фазы разработки я помещал свой файл «user.properties» в папку maven/src/main/resources /.

Мой файл свойств загружен:

final Properties p = new Properties(); 
final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

Теперь я хочу, чтобы сохранить этот файл вне JAR и иметь что-то вроде этого:

- execution_folder 
    |_ file.jar 
    |_ config 
     |_ user.properties 

Я пробовал много вещей, с Maven плагинов как maven-jar-plugin, maven-surefire-plugin и maven-resources-plugin, но я не могу заставить его работать ...

Заранее благодарим за вашу помощь!

+0

Является ли user.properties только отдельным текстовым файлом, который вы держите рядом со своей банкой и хотите читать во время выполнения? Потому что если так ...вы должны, вероятно, просто лечить, так же, как и любой другой внешний файл. – Deltharis

+0

Да, это всего лишь отдельный файл, но дело в том, что . 1- Я не знаю, где будет помещен файл jar и config. 2 - I имеют другие файлы ресурсов, используемые зависимостями (соединение с БД и другие) – GournaySylvain

+0

Если вам нравится файл свойств снаружи, вам нужно установить classpath для указания на папку 'executon_folder/config /', иначе вы не сможете получить доступ к своему пользователю. properties'. Таким образом, простой 'java -jar file.jar' не будет работать. – khmarbaise

ответ

13

Я нашел то, что мне нужно, используя только конфигурацию maven.

Сначала я добавить папку конфигурации к классам:

<build> 
<plugins> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Class-Path>config/</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 
</plugins> 
</build> 

я загрузить ресурсы точно так же, как и раньше:

final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

И если вы хотите сохранить ваши примеры файлов ресурсов в вашем репо и удалите их из своей сборки:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <excludes> 
       <exclude>user.properties</exclude> 
       <exclude>conf/hibernate.cfg.xml</exclude> 
      </excludes> 
     </resource> 
    </resources> 
</build> 

Рядом с файлом jar я добавляю папку конфигурации все файлы ресурсов, которые мне нужны.

Результат:

  • user.properties могут быть загружены с помощью getResourceAsStream
  • другие библиотеки, опирающиеся на конкретные ресурсы (я не буду спорить, но я нахожу это ... не так хорошо) могут загружать свои ресурсы без каких-либо проблем.

Спасибо за помощь, и я надеюсь, что это может помочь кому-нибудь когда-нибудь!

+0

Я хочу сделать то же самое, но сначала мне нужно получить каталог configs рядом с файлом jar. Как это сделать? – SachiDangalla

+0

Я не совсем понимаю ваш вопрос здесь ... В моем сценарии файлы конфигурации не были сохранены в файле jar (исключены в файле pom.xml). Создание и копирование ваших файлов конфигурации должно управляться со стороны развертывания. – GournaySylvain

+0

Да. Я хочу, чтобы получить конфигурационную папку за пределами банки без ручного копирования или вставки. Как ты с этим справился? – SachiDangalla

1

Как я упоминал в комментарии - похоже, вы хотите использовать файл user.properties просто как текстовый файл, который лежит помимо вашей банки. Если это так, то использование его довольно просто - каталог, содержащий ваш файл jar, является текущим каталогом, когда он проверяется во время выполнения. Это означает, что все, что вам нужно, это:

properties.load(new FileInputStream("config/user.properties")); 

не пытаясь ввести в проект путь к классу.

И если что-то еще нужно сделать, это просто скопировало бы ваши свойства из каталога ресурсов для таргетинга, чтобы избежать неприятностей с его выполнением вручную. Это может быть достигнуто с помощью maven-antrun-plugin:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 
          <mkdir dir="${project.build.directory}" /> 
          <copy file="${basedir}/src/main/resources/user.properties" tofile="${project.build.directory}/config/user.properties" /> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Я понимаю ваше решение, и я мог бы использовать его для некоторых моих файлов, но в моих ресурсах, У меня также есть «hibernate.cfg.xml» и некоторые другие файлы, которые используются библиотекой, которую я вызываю. И эта библиотека ищет файлы ресурсов (с вызовом _getResourceAsStream_) – GournaySylvain

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