2010-06-08 19 views
30

Tengo un proyecto simple de Java Maven. Una de mis clases al ejecutar necesita cargar un archivo de configuración xml desde classpath. No quiero empaquetar dicho archivo xml al producir el jar, pero quiero incluir un archivo xml predeterminado en un ensamblado zip bajo una subcarpeta conf y también quiero que este xml predeterminado esté disponible en las pruebas unitarias para probarlo.Donde en la ruta del proyecto maven debería poner archivos de configuración que no se consideran recursos

mi punto de vista hay 2 lugares posibles de este default xml:

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

Ambas soluciones exigen acciones pom especiales:

  • En solución 1, obtengo la copia automática en la carpeta de destino durante b Uild, lo que significa que está disponible en las pruebas, pero también lo obtengo en el envase producido que no quiero.

  • En la solución 2, obtengo el jar como lo quiero (sin el xml) pero manualmente tengo que copiar el xml a la carpeta de destino para estar disponible para la prueba. (No quiero agregar las subcarpetas de src en el classpath de prueba. Creo que es una mala práctica).

Pregunta: ¿cuál es la mejor solución de las dos?
- Si el correcto es 2, ¿cuál es la mejor manera de copiarlo en la carpeta de destino?
- ¿Hay alguna otra solución mejor y más común que esas dos?

(También leo Where should I put application configuration files for a Maven project? pero me gustaría saber cuál es la "solución correcta" desde el punto de vista de "convención sobre configuración" y este enlace proporciona algunas soluciones de tipo de configuración pero no orientadas a convenciones. Tal vez no exista uno pero pregunto de todos modos. También las soluciones proporcionadas incluyen el plugin AntRun y ​​el plugin appAssembler y me pregunto si podría hacerlo sin ellos.)

Respuesta

37

La pregunta es ¿cuál es la mejor solución de las dos? Si el correcto es 2, ¿cuál es la mejor manera de copiarlo a la carpeta de destino? ¿Hay alguna otra solución mejor y más común que esos dos?

Puesto que desea que el archivo se copia en la carpeta target/classes, se ha de alguna manera para ser considerado como un recurso (por lo que o bien poner en menos de src/main/resources o declaran como src/main/conf directorio de recursos).Y si usted no quiere que en el frasco final, configurar el Maven JAR Plugin para excluirla:

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <configuration> 
      <excludes> 
      <exclude>**/conf/*</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 

Para la parte de montaje, los descriptores de montaje son bastante flexibles por lo que debería ser posible lograr lo que desee, independientemente de la elección. Sugeriría usar la configuración más fácil sin embargo.

+1

Hay Problemas con ambas soluciones: 1./declarar 'conf' como un recurso todavía lo incluye en el contenedor, y no nos deja una manera fácil de excluir; 2./crear 'conf' dentro de los recursos, y excluirlo en el complemento hace que no esté en la raíz de la ruta de clase. – YoYo

+0

por alguna razón esta es una de las pocas respuestas útiles en general para "cómo excluir algo de Maven Jar" cuando se busca en Google ... incluso si no responde OP exactamente, sigue siendo un gran ejemplo de usar 'maven-jar -plugin' – mmcrae

1

Puede colocarlo en src/test/conf/default.xml. Sus clases de prueba pueden encontrarlo, pero no se empacarán utilizando el método estándar.

Con un conjunto adicional, puede empaquetarlo desde allí. Ese paso siempre es necesario.

Una solución diferente podría ser crear un módulo maven por separado y colocarlo en/src/main/resources/conf/.... Luego, haga de este jar una dependencia de prueba. No es necesario que realice ninguna configuración de complemento especial, pero creo que es excesivo para un solo archivo.

+0

lo que no me gusta de esta solución es que el conjunto de la producción de la cremallera tendrá que obtener de src/test/conf y este xml no es solo un archivo de prueba. Supongo que su solución propuesta es la misma si la coloco en src/main/conf Desde allí también es visible para las pruebas de la carpeta target/classes en lugar de target/test- ¿Está mal hacer las pruebas que obtienen datos del objetivo/clases o deben depender solo de las clases objetivo/de prueba? – Paralife

1

Mi solución fue usar dos perfiles: Desarrollo (predeterminado) y Embalaje

Mi default/sección contiene dos src/main/resources y src/main/conf. Yo llamo a esto mi perfil de Desarrollo, que es un perfil implícito.

Mi perfil de paquete es un perfil explícito que se define en la sección. Abajo/solo mencioné src/main/resources. Cuando estoy ejecutando mi script de empaquetado (actualmente tenemos esto externo a maven ya que está construyendo un RPM fuera de nuestra WAR), estoy ejecutando 'mvn install -Drpm' para activar mi perfil de Empaquetado (rpm es la identificación para el Empaquetado) perfil.

Si esto no era lo suficientemente claro, no dude en hacer más preguntas.

Cuestiones relacionadas