Как мне выбрать расположение файлов конфигурации в проекте Maven?
-
09-12-2019 - |
Вопрос
Я создаю инструмент командной строки, который использует некоторые файлы конфигурации.
При разработке я поместил эти файлы в папку src/main/resources
, и доступ к нему осуществляется getClass().getResourceAsStream("/config-file-name")
, что хорошо работает.
Я выбираю плагин maven-assembly-plugin для сборки jar со всеми зависимостями.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.myproject.Scheduler</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Все файлы конфигурации упакованы в jar, но я хочу разделить их.
Итак, я добавляю следующую конфигурацию:
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>conf.properties</include>
</includes>
<filtering>true</filtering>
<excludes>
<exclude></exclude>
</excludes>
<targetPath>..</targetPath>
</resource>
</resources>
После этого файлы конфигурации оказываются рядом с jar, а не завернуты в jar.
Но мой код сейчас не может получить доступ к файлам.
Нужно ли мне изменить способ доступа к файлам в коде?
Или мне не нужно помещать эти файлы в src/main/resources/
, есть альтернатива?
Если кто-то знает, пожалуйста, помогите.
Спасибо.
Обновлять:Наконец, я отказываюсь от использования файла ресурсов maven, вместо этого я устанавливаю путь к файлу по тому же пути, что и jar по умолчанию, все работает хорошо, за исключением того, что Eclipse жалуется.
Поскольку я хочу переместить файл конфигурации из jar и не хочу, чтобы он находился в папке target/classes, поэтому я использую <targetPath>..</targetPath>
чтобы переместить файл конфигурации в тот же каталог, что и файл jar.
Когда я повторно создаю настройки проекта Eclipse, Eclipse говорит:Невозможно вложить выходную папку «project/target/test-classes» в выходную папку «project/target».
Кто-нибудь мне поможет?
Решение 3
В конце концов я отказался от использования файла ресурсов maven, вместо этого установил путь к файлу по тому же пути, что и jar по умолчанию, все работает хорошо, за исключением того, что Eclipse жалуется.
(Поскольку я хочу переместить файл конфигурации из jar и не хочу, чтобы он находился в папке target/classes, поэтому я использую ..чтобы переместить файл конфигурации в тот же каталог, что и файл jar.Когда я повторно создаю настройки проекта Eclipse, Eclipse говорит:Невозможно вложить выходную папку «project/target/test-classes» в выходную папку «project/target».)
До сих пор я не нашел решения, похоже, это ошибка затмения.
Теперь я отказался от Eclipse и перешел на IntelliJ IDEA, это довольно хорошая IDE, особенно прекрасно интегрированная с Maven.Я избегаю любого шанса использовать eclipse для любого проекта Maven.
Другие советы
Ваше приложение не может получить доступ к файлам конфигурации, поскольку они больше не находятся в его пути к классам.
Если вы хотите отделить файлы конфигурации от остальной части приложения, возможно, вам стоит пересмотреть свои файлы конфигурации. формат сборки.Возможно, вы захотите использовать bin вместо jar-with-dependents, хотя это сопряжено с проблемами при распространении и использовании.
В зависимости от того, насколько сложен файл свойств, вы можете использовать возможность фильтра плагина ресурсов, чтобы изменить значение на основе профилей maven.Например, если вы хотите иметь свойство с именем location, вы можете определить профиль разработки и производства, а затем установить значение свойства maven в pom (или Profiles.xml, если вы используете maven 2):
<properties>
<my.location>the_real_value</my.location>
</properties>
Затем в файле свойств вы должны сделать это:
location=${my.location}
Просто убедитесь, что вы включили фильтрацию в своем pom, например:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
Если при сборке вы заглянете в целевой каталог и просмотрите этот файл свойств, вы увидите подставленное правильное значение.