2012-02-11 29 views
15

He utilizado el plugin maven-ear-plugin con maven-war-plugin y maven-ejb-plugin para implementar y ejecutar con éxito una aplicación empaquetada como EAR a Jboss AS7.Cómo configurar class-path correctamente en maven-war-plugin

. 
|-- META-INF 
| |-- application.xml 
| |-- MANIFEST.MF 
| `-- maven 
|  `-- com.patrac 
|   `-- Patrac-ear 
|    |-- pom.properties 
|    `-- pom.xml 
|-- Patrac-ejb-1.0-SNAPSHOT.jar 
`-- Patrac-web-1.0-SNAPSHOT.war 

En los directorios de código fuente de la aplicación, los poms están ubicados de la siguiente manera:

. 
| 
|-- Patrac-ear 
| `-- pom.xml 
|-- Patrac-ejb 
| `-- pom.xml 
|-- Patrac-web 
| `-- pom.xml 
`-- pom.xml 

no puedo encontrar la manera de detener algunos mensajes de advertencia molesto cuando implementar la aplicación:

!
12:32:03,958 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-ui-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,970 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,984 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,989 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-impl-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 

Patrac-web-1,0-SNAPSHOT.war META-INF/MANIFEST.MF se parece a esto:

Manifest-Version: 1.0 
Built-By: pgarner 
Build-Jdk: 1.7.0_02 
Class-Path: Patrac-ejb-1.0-SNAPSHOT.jar richfaces-components-ui-4.0.0. 
Final.jar richfaces-components-api-4.0.0.Final.jar richfaces-core-api 
-4.0.0.Final.jar richfaces-core-impl-4.0.0.Final.jar cssparser-0.9.5. 
jar sac-1.3.jar guava-r08.jar 
Created-By: Apache Maven 
Archiver-Version: Plexus Archiver 

La entrada ejb class-path debe estar presente para el módulo EJB, para su portabilidad, y las entradas richfaces, cssparser y guava class-path NO deben estar en el manifiesto de WAR.

El problema es que mi WAR depende de todos los JAR, algunos de los cuales viven en WEB-INF/lib (RichFaces), y un JAR, Patrac-ejb-1.0-SNAPSHOT.jar, que vive en el directorio raíz del EAR. Cada dependencia debe ingresarse en Patrac-web/pom.xml pero NO cada una de las dependencias debe aparecer en el manifiesto.

Maven coloca los JAR en los lugares correctos, pero coloca las entradas de la ruta de clase para TODOS los JAR en el manifiesto. No debería hacer esto. SÓLO debe poner una entrada para Patrac-ejb-1.0-SNAPSHOT.jar.

<!-- 
    According to Java EE 6 spec, the application is portable if 
    Patrac-web.war's META-INF/MANIFEST.MF contains a Class-Path entry 
    for Patrac-ejb-1.0-SNAPSHOT.jar. 

    <optional>true</optional> is the flag that maven-war-plugin uses 
    to put the entry in MANIFEST.MF without copying Patrac-ejb-1.0-SNAPSHOT.jar 
    into WEB-INF/lib. This is what I want. 

    <scope>provided</scope> would cause maven-war-plugin to NEITHER 
    put the entry in MANIFEST.MF nor copy Patrac-ejb.jar into WEB-INF/lib, 
    which would not be good. 

    No tag at all would cause maven-war-plugin to BOTH put the entry in 
    MANIFEST.MF and copy Patrac-ejb.jar into WEB-INF/lib, which would 
    also not be good. 
    --> 
    <dependency> 
    <groupId>com.patrac</groupId> 
    <artifactId>Patrac-ejb</artifactId> 
    <type>ejb</type> 
    <optional>true</optional> 
    </dependency> 

    <!-- 
    These two dependencies are used to copy 
    the other JAR files into WEB-INF/lib and there 
    should not be any class-path entries for such 
    JARs in MANIFEST.MF, in order to avoid the 
    error messages. 
    --> 
    <dependency> 
     <groupId>org.richfaces.ui</groupId> 
     <artifactId>richfaces-components-ui</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.richfaces.core</groupId> 
     <artifactId>richfaces-core-impl</artifactId> 
    </dependency> 

Estoy utilizando la versión más reciente de maven-war-plugin, 2.2. ¿Cómo le digo a maven-war-plugin que coloque los JAR "no-ejb" en WEB-INF/lib sin poner entradas de clase en MANIFEST.MF?

Cualquier consejo o consejos que tenga son muy apreciados.

Referencias:

Respuesta

19

El Maven archiver, utilizado por Maven WAR plugin, proporciona un medio para generar entradas de Class-Path en el manifiesto de WAR pero desafortunadamente el archivador toma un enfoque de todo o nada. Una vez que pase addClassPath=true a la configuración del archivo, el archivador coloca las entradas de la ruta de clase para todas las de las dependencias requeridas y opcionales de WAR en el manifiesto.

Sin embargo, algunas entradas simplemente no pertenecen allí. Las entradas de Class-Path se usan para denotar "Download Extensions," o referencias a JAR external para WAR.Los JAR ubicados en WEB-INF/lib deben no, por lo tanto, tienen entradas de ruta de clase en el manifiesto de WAR. El complemento War de Maven rompe esta regla cuando configuras addClassPath=true en el archivador.

Además, cuando pasa addClassPath=true al archivador de Maven, le da a todas las entradas de la ruta de clase el mismo prefijo de directorio, sin importar dónde se encuentran las dependencias dentro del EAR. Esto causa problemas cuando las dependencias opcionales y requeridas se encuentran en ubicaciones separadas, como el directorio raíz EAR, EAR lib y WAR WEB-INF/lib.

Naturalmente, cuando uno despliega un EAR cuyo manifiesto WAR contiene los errores anteriores JBoss lanza advertencias si el cargador de clases WAR en última instancia puede encontrar una dependencia (JAR encuentran en WEB-INF/lib) o errores si el prefijo de la ruta de clase es incorrecto (por ejemplo, en una EJB JAR o una dependencia en el directorio EAR lib).

Por lo tanto, si su WAR, como el mío, depende de un módulo EJB, que se encuentra en la raíz de la oreja, y cualquier número de dependencias que se encuentran en WEB-INF/lib, Maven archivador generará entradas Class-Path para toda la dependencias y todos tendrán el mismo prefijo, independientemente de su ubicación dentro del EAR.

No es bueno.

El problema se mejoraría si el archivador proporcionara un medio para excluir las entradas de ruta de clase de los archivos JAR ubicados en WEB-INF. Pero no es así

Aquí está un resumen de los resultados para cada ajuste de la dependencia cuando uno utiliza addClassPath=true:

  Setting     Generate    Copy JAR into 
            Class-Path    WEB-INF/lib 
            Entry 

1. <scope>provided</scope>    NO      NO 

2. <optional>true</optional>   YES      NO 

3. (no option -- default)    YES      YES 

4. ?????        NO      YES 

Lo que se necesita es la cobertura de la situación # 4, más arriba: no crear una entrada Class-Path y, sí, copie el JAR en WEB-INF/lib. El archivador de Maven debería implementar este comportamiento de forma predeterminada.

La mejor solución que se me ocurre es usar fuerza bruta y desactivar la generación automática de entradas del Class-Path del archivador Maven. En su lugar, creo explícitamente una entrada de ruta de clase para el módulo EJB en el manifiesto de WAR utilizando la opción manifestEntries del archivador. La forma de hacerlo es eliminar la siguiente de Patrac-web/pom.xml:

<manifest> 
    <addClasspath>true</addClasspath> 
</manifest> 

y sustituirla por la siguiente:

<manifestEntries> 
    <Class-Path>Patrac-ejb-${project.version}.jar</Class-Path> 
</manifestEntries> 

Usando esta configuración sólo una entrada Class-Path, para el módulo EJB, se crea explícitamente.

1

Para los tarros con necesidad de ser excluidos de MANIFEST y desde WEB-INF/lib que necesitan para marcarlos como <scope>provided</scope>. Eso significa que los archivos JAR serán proporcionados por el contenedor (y eso es EAR en su caso).

Para otras opciones, marque WAR manifest guide.

+1

el [Guerra manifiesto guía] (http: // Mave n.apache.org/plugins/maven-war-plugin/examples/war-manifest-guide.html) muestra 3 ejemplos y proporciona una nota: "No se muestra cómo se muestra cómo incluir una dependencia en WEB-INF/lib pero no en la ruta de clase del manifiesto". La Guía dice: "Consulte la [Guía para trabajar con manifiestos] (http://maven.apache.org/guides/mini/guide-manifest.html) para ver más ejemplos". Esta segunda página simplemente me remite a la página de guía de manifiesto de WAR. Necesito poder seguir el ejemplo que no se muestra. –

+0

¿Desea incluir una dependencia en WEB-INF/lib pero no en el classpath de manifiesto? ¿Por qué lo necesitas? Si tus 'richfaces',' cssparser' y 'guava' salen en EAR, entonces estas dependencias deberían estar marcadas como' provided'. –

+0

Richfaces y otros son dependencias requeridas del módulo WAR. Por lo tanto, deberían estar en WEB-INF/lib. Tengo entendido que no es necesario realizar entradas de Class-Path para los JAR en WEB-INF porque el cargador de clases de WAR carga estos archivos automáticamente. Solo las entradas de ruta de clase para JAR _external_ al módulo WAR deben ingresarse en el manifiesto de WAR. En mi caso, debe hacerse una entrada para EJB JAR. Esto es por especificación JEE. RichFaces y otros son dependencias requeridas del módulo WAR y, por lo tanto, no deben marcarse como 'provided'. –

0

el EJB entrada de la clase de la ruta tiene que estar presente para el módulo EJB ...

La clase de la ruta sólo tiene que estar presente para módulos EJB (en la raíz de la EAR) que hagan referencia a otras módulos EJB (en la raíz de la misma EAR)

Cuestiones relacionadas