2010-04-28 29 views
20

Tengo una aplicación java con la siguiente estructura del proyecto:Cómo excluir el archivo de propiedades del archivo jar?

myProject 
    | 
    |----src 
    |  | 
    |  |--main 
    |  | 
    |  |--resources 
    |   | 
    |   |--userConfig.properties 
    |   |--log4j.properties 
    | 
    |---target 

estoy usando Maven para construir mi proyecto. Estoy usando maven comando para construir archivo jar de la siguiente manera:

mvn package -DMaven.test.skip=true 

que quiero excluir userConfig.properties archivo de mi archivo JAR, así que he actualizado mi pom.xml de la siguiente manera:

<excludes> 
    <exclude>**/userConfig.properties</exclude> 
</excludes> 

pero excluye de la Carpeta de destino en la que reside el código compilado. Y la aplicación no se ejecutará porque no puede encontrar el archivo userConfig.properties.

¿Alguien me puede ayudar?

+0

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? –

+0

¿Estás usando el marco Spring? –

+0

Sí, Chris, estoy usando Spring Framework. –

Respuesta

9

Deberías echar un vistazo a this.

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <excludes> 
      <exclude>**/userConfig.properties</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 
1

Creo que probablemente ya está haciendo correctamente, dependiendo del lugar donde se ha configurado que excluye (consulte con jar tf qué archivos están realmente en su frasco). Lo más probable es que tengas problemas porque el archivo no se encuentra en tu ruta de clase y, por lo tanto, tu aplicación no puede encontrarlo. Intente agregar el directorio con el archivo de recursos en el classpath.

Es posible que desee establecer algunos valores predeterminados y dejar que la aplicación lea en su configuración desde una ruta predefinida, para evitar tener que meterse con el classpath.

38

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í.

+1

¡Gracias por su solución! ¡¡¡Salvas mi vida!!! –

+0

Me gusta la idea de jar ejecutable con classpath correctamente establecido. Tal vez puedas consultar [Maven Assembly Plugin] (http://maven.apache.org/plugins/maven-assembly-plugin/) también. Lo usé para crear zip con la misma estructura que tienes (con la excepción de que mi jar no es ejecutable..yet (-;) - por lo que puede lograr lo mismo, reemplazando recursos y complementos de dependencia con el ensamblado ... – Betlista

+0

THIS.IS.A.LIFESAVER. – jmcg

Cuestiones relacionadas