2010-11-12 23 views
13

estoy trabajando en un proyecto Maven multi-módulo, cuya estructura es la siguiente:log4j en un proyecto Maven multi-módulo de

war-module 
jar-module 

El módulo guerra depende de la jarra-módulo, y la voluntad agregue el artefacto de jar al directorio lib de la aplicación web después del empaquetado.

Y tanto war-module como jar-module usan Apache log4j para el registro y comparten el mismo archivo de configuración log4j (log4j.xml), que actualmente se encuentra en el proyecto jar-module. Y este log4j.xml se empacará en el archivo jar-module.jar; sin embargo, me gustaría ingresar al directorio WEB-INF/classes en el paquete war en lugar de hacerlo en el archivo jar para que los usuarios puedan encontrarlo fácilmente. archivo de configuración y modifíquelo si es necesario (es muy difícil para ellos encontrarlo si este archivo está en WEB-INF/lib/jar-module.jar porque hay muchos otros jarros debajo de ese directorio).

Mi pregunta es: ¿cuál es la forma de Maven para resolver este problema?

Actualización:.

Mi proyecto real es un poco más complejo, y hay un módulo oído que depende del frasco-módulo también (también conocido como el módulo frasco puede utilizarse de forma independiente en varios diferentes proyectos, y no puedo simplemente poner el archivo en el directorio war-module/src/main/resources para solucionar este problema). Y no quiero duplicar algunos archivos de configuración como log4j.xml (y otros archivos de configuración como myapp.properties) en varios proyectos.

+0

Es ese frasco utilizado independiente? Si no es así, ¿por qué tener un 'log4j.xml' en' src/main/resources'? –

Respuesta

10

Encontré la respuesta mediante más búsquedas en la web.

En general, hay tres maneras de compartir recursos en un proyecto de varios módulos Maven:

  • cortar y pegar.
  • Asamblea uso y dependencia plugins
  • Use los maven-remote-recursos-plugin

Aquí hay una entrada de blog de Sonatype, la compañía detrás de Maven, el compartir recursos a través de proyectos de Maven, y es la respuesta exacta necesito:

http://www.sonatype.com/people/2008/04/how-to-share-resources-across-projects-in-maven/

5

En el módulo frasco, excluir el archivo de la jarra:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <excludes> 
     <exclude>log4j.xml</exclude> 
     </excludes> 
    </configuration> 
</plugin> 

Usar el plugin buildhelper para unir el log4j.xml a la acumulación como un artefacto separado

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.5</version> 
    <executions> 
     <execution> 
     <id>attach-artifacts</id> 
     <phase>package</phase> 
     <goals> 
      <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
      <artifacts> 
      <artifact> 
       <file>${project.build.outputDirectory}/log4j.xml</file> 
       <type>xml</type> 
       <classifier>log4j</classifier> 
      </artifact> 
      </artifacts> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Ahora en su artefacto de guerra, copie el xml en el directorio de salida:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>copy</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>copy</goal> 
     </goals> 
     <configuration> 
      <artifactItems> 
      <artifactItem> 
       <groupId>${project.groupId}</groupId> 
       <artifactId>your.jar.project.artifactId</artifactId> 
       <version>${project.version}</version> 
       <type>xml</type> 
       <classifier>log4j</classifier> 
       <outputDirectory>${project.build.outputDirectory} 
       </outputDirectory> 
       <destFileName>log4j.xml</destFileName> 
      </artifactItem> 
      </artifactItems> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Pero, por supuesto, sería más fácil simplemente poner el archivo en [web-artifact]/src/main/resources en primer lugar :-)

+0

¡Daría otro +1 por la última oración si pudiera! –

1

Desde mi experiencia, esto puede llevarse a cabo de una manera fácil, simplemente:

  1. Establezca el recurso de configuración log4j en el módulo principal.
  2. Llamar a la dependencia de log4j en todos los módulos pom.

la esperanza que esto ayudará a

+6

Puede mejorar la calidad de su respuesta dando un ejemplo simple de esto. – therealrootuser

+0

1. Crear un proyecto con común-config 2. En la carpeta src/main/resources poner el log4j o logback archivo de configuración 3. Instalar el artefacto en el repositorio local de Maven para ser utilizado por otros proyectos 4. Añadir la dependencia como una dependencia Maven normales en los proyectos posteriores \t \t ' \t \t \t com.your.group.id \t \t \t común-config proporcionan \t \t ' yo prefiero usar el alcance previsto y proporcionar el archivo desde una carpeta de ruta de clases de configuración en tiempo de ejecución. – razvanone

Cuestiones relacionadas