Encontré este escenario también. Básicamente, desea poder ejecutar su código localmente desde Eclipse utilizando algún archivo userConfig.properties que sea de fácil acceso, como por ejemplo dentro de /src/main/resources
. Además, desea proporcionar un JAR ejecutable compilado con un userConfig.properties externo que le permite al usuario configurar la aplicación sin descifrar el JAR.
Mi aplicación es el siguiente: correr mvn clean install
serán:
- crear JAR ejecutable con el especificado
mainClass
- excluye todas
.properties
archivos ubicados en src/main/resources
del JAR
- dependencias del proyecto copia en una carpeta
lib
en su proyecto raíz
- copie todos los archivos ubicados en
src/main/resources
en un conf
carpeta en su proyecto raíz. Tenga en cuenta que este paso es una conveniencia opcional para sus usuarios del JAR. Puede requerir que se cree explícitamente este archivo en el directorio conf
. Este directorio conf
se agrega efectivamente a su classpath de tiempo de ejecución a través del manifiesto.
- añadir esta carpeta
conf
al manifiesto, que proporciona acceso a él desde su JAR ejecutable
El uso de estos plugins de Maven en conjunto con los demás en su configuración POM le dará lo que necesita. En cuanto a las "mejores prácticas" de esta solución; No estoy seguro.
Usando maven-dependencia-plugin como sigue:
<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>
Usando maven-jar-plugin como sigue:
<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>
Usando maven-recursos-plugin de la siguiente manera:
<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>
Usando esta configuración de proyecto, puedo ejecutar en Eclipse usando una configuración, y proporcionar a mis usuarios un archivo de propiedades para configurar, sin que las propiedades se pisen entre sí.
Su pregunta no tiene ningún sentido. Usted dice que quiere excluir un archivo, pero luego dice que su aplicación no funciona porque el archivo está excluido. Entonces, ¿por qué querías excluirlo en primer lugar? –
¿Estás usando el marco Spring? –
Sí, Chris, estoy usando Spring Framework. –