En Maven2, ¿cuál es la forma más sencilla de construir un WAR y EAR para contener las cuales combaten en un solo POM?

StackOverflow https://stackoverflow.com/questions/1870149

Pregunta

La situación es bastante sencillo. Tengo una aplicación web Java que estoy convirtiendo a ser construido con Maven. En la actualidad, la aplicación está construida con Ant en un único archivo WAR, que se incluye a continuación en un oído con una muy simple aplicacion.xml.

maven-war-plugin y maven-ear-plugin ambos se ven bastante sencillo para mí, y parece que me está configurando a ser obligado a considerar lo anterior como dos proyectos distintos, con el proyecto de la guerra como una dependencia del proyecto EAR. Esto parece un poco incómodo, sobre todo debido a que un ajuste de perfil del proyecto GUERRA cambiará para cada entorno, que parece como que me obligaría a duplicar esa acumulación de ajustar cada vez que he tratado de construir el EAR también.

Todo lo que quiere decir: ¿hay una forma sencilla de construir la guerra y en este paquete que trivialmente simple oreja? Me gustaría evitar el mantenimiento de estos como dos proyectos separados, pero habría manera similar prefieren no recurrir a un truco demasiado desordenado usando montajes para lograr esto.

¿Fue útil?

Solución

  

Todo lo que quiere decir: ¿hay una forma sencilla de construir la guerra y en este paquete que trivialmente simple oreja? Me gustaría evitar el mantenimiento de estos como dos proyectos separados, pero habría manera similar prefieren no recurrir a un truco demasiado desordenado usando montajes para lograr esto.

Respuesta corta: no , no hay ningún experto-forma sencilla de hacerlo ya que esto iría en contra de una regla de Maven que es "un artefacto por proyecto" (comprender una salida por proyecto que es cierto en el 99% de los casos).

Y, de hecho, yo recomendaría fuertemente a no seguir el camino hacky y olvidar el uso de montajes para crear un EAR. En su lugar, crear dos módulos, uno con un embalaje de tipo war y el otro con un embalaje de tipo ear dependiendo del artefacto de guerra y declarar como módulos de un pom.xml padres. De esta manera:

my-project
|-- pom.xml       // packaging of type pom and my-war and my-ear as modules
|-- my-war
|   `-- pom.xml   // packaging of type war
`-- my-ear
    `-- pom.xml   // packaging of type ear

Si vas para Maven, adoptar la filosofía de Maven, no luchar contra ella, que le ahorrará mucho dolor. En serio, la piratería asambleas para hacer lo que el experto en la oreja-plugin ya está haciendo es sólo contra SECO. Será mejor que se adhieren a la hormiga en ese caso.

Otros consejos

Sé que esto es de 5 años de edad ahora, pero aún así era la primera respuesta que se le ocurrió cuando busqué. También, mientras que "esa no es la manera experta" es una respuesta perfectamente razonable para algunas personas, otros pueden todavía prefieren utilizar una sola pom como pidió el OP, y realmente no es tan complicado.

En primer lugar, crear un pom.xml guerra estándar para generar el archivo de la guerra que desee incluir en el oído. Deja el embalaje como la guerra.

A continuación, escriba su propio aplicacion.xml (en src / main / aplicación o donde sea) utilizando un marcador de posición para el nombre de archivo de la guerra:

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>

Y incluya ningún archivo XML específicos del servidor WebLogic (-aplicacion.xml etc.) en el mismo lugar.

A continuación, agregar una sección de recursos para reemplazar el marcador de posición con el nombre de archivo de la guerra:

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

Por último, añadir una tarea de hormiga oreja a oreja construido el:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

Y eso es todo.

En cada proyecto Maven producir un aritifact. En su situación Sugiero crear dos un proyecto para la guerra y otro para el oído. Si necesita versiones mutltiple de sus proyectos puede achive que el uso de clasificadores y perfiles.

Este es extracto de richfaces ejemplos POM.

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

En la oreja perfiles de uso pom importar la dependencia requerida con el clasificador apropiado.

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top