Я тоже столкнулся с этим сценарием. По сути, вы хотите иметь возможность запускать свой код локально из Eclipse, используя некоторый файл userConfig.properties , который легко доступен, например, внутри /src/main/resources
. Кроме того, вы хотите предоставить скомпилированный исполняемый файл JAR с внешним userConfig.properties , который позволяет пользователю настраивать приложение без взлома JAR.
Моя реализация выглядит следующим образом: выполнение mvn clean install
будет:
- создать исполняемый JAR с указанным
mainClass
- исключить все
.properties
файлы, расположенные в src/main/resources
из JAR
- скопировать зависимости проекта в папку
lib
в корневом каталоге вашего проекта
- скопируйте все
.properties
файлы, расположенные в src/main/resources
, в папку conf
в корневом каталоге вашего проекта. Обратите внимание, что этот шаг является дополнительным удобством для ваших пользователей JAR. Вы можете явно создать этот файл в каталоге conf
. Этот каталог conf
эффективно добавляется в путь к классам во время выполнения через манифест.
- добавьте эту папку
conf
в манифест, предоставляя доступ к ней из исполняемого файла JAR
Использование этих плагинов Maven в сочетании друг с другом в конфигурации POM даст вам то, что вам нужно. Что касается «лучших практик» этого решения; Я не уверен.
Использование maven-dependency-plugin следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
Использование maven-jar-plugin следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>package.path.to.your.main.class.MainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
Использование maven-resources-plugin следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
Используя эту настройку проекта, я могу работать в Eclipse, используя один конфиг, и предоставить моим пользователям файл свойств для настройки, без влияния свойств друг на друга.