2012-02-14 14 views
17

He utilizado un arquetipo de Maven (webapp-javaee6) para crear un nuevo proyecto de Java EE 6 pero no entiendo por qué se ponen ciertas cosas dentro del elemento build del POM. Para ser específico, no entiendo por qué el javaee-endorsed-api.jar se copia en el directorio endosado. De acuerdo con la respuesta a la pregunta this, esto es necesario para la compilación, pero mi proyecto compila bien cuando elimino el elemento relacionado plugin bajo build.Nuevo proyecto de Maven usando arquetipos: ¿por qué se copia javaee-endorsed-api.jar en POM?

Dado que javax:javaee-web-api ya se proporciona como una dependencia en el POM, ¿no se puede utilizar para la compilación?

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <compilerArguments> 
        <endorseddirs>${endorsed.dir}</endorseddirs> 
       </compilerArguments> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${endorsed.dir}</outputDirectory> 
         <silent>true</silent> 
         <artifactItems> 
          <artifactItem> 
           <groupId>javax</groupId> 
           <artifactId>javaee-endorsed-api</artifactId> 
           <version>6.0</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+2

Personalmente prefiero comenzar con [Maven Archetype Webapp] (http://maven.apache.org/guides/mini/guide-webapp.html) dulce y simple, y luego agregar dependencias y productos de lujo según los requisitos del proyecto. – Nishant

Respuesta

5

Se debería compilar, porque hay también una dependencia de este artefacto:

<dependencies> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Maven manual page describe proporcionan de la siguiente manera:

Esto es muy similar a la compilación, pero indica que espera que el JDK o un contenedor proporcione la dependencia en tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, debe establecer la dependencia de la API de Servlet y las API de Java EE relacionadas en el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance solo está disponible en el classpath de compilación y prueba, y no es transitivo.

Por lo tanto, en mi opinión, copiar esta dependencia no tiene ningún impacto en la compilación.

Sin embargo, el autor de arquetipo quería por alguna razón copiar el paquete API de Java EE 6 al directorio respaldado. Esto podría ser útil si decide iniciar el servidor Jetty y realizar algunas pruebas en "Fase de prueba" (por ejemplo, con JUnit).

Si no lo está utilizando, simplemente elimínelo.

+1

En mi humilde opinión, esta respuesta no aborda el problema principal: "¿por qué javaee-endorsed-api.jar se copia en el directorio endosado". –

14

[Encontrado en cuestión MARCHETYPES-35 través mirando a la source of the webapp-javaee6 archetype]

Antecedentes
El paquete javax.annotation de JSR 250: Anotaciones comunes está presente no sólo in Java EE sino también in the JDK.

versiones utilizadas
JDK 6: Anotaciones comunes 1.0
Java EE 6: Anotaciones comunes 1.1
JDK 7: Anotaciones comunes 1.1
Java EE 7: Anotaciones comunes 1,2

Problema
Al compilar un proyecto Java EE, las anotaciones del JDK tienen prioridad sobre las anotaciones del archivo javaee-web-api. Cuando una anotación de javaee-web-api define un nuevo elemento, el compilador podría no verlo y fallar con un error.

Por ejemplo
6 Cuando un proyecto Java EE utiliza @Resource(lookup = "...") y se compila con JDK 6, por lo general sería un fracaso.

Anotaciones comunes 1.1 introduces the new elementResource.lookup(). Pero normalmente el compilador solo vería la anotación de Recursos de JDK 6 que usa Anotaciones comunes 1.0 without this element.

Solución
era utilizar el argumento <endorseddirs> compilador que usted describe. Para obligar al compilador a usar la versión correcta de las anotaciones.

Java EE 7
Como entiendo la changelog for Common Annotations 1.2 para Java EE 7, no hay nuevos elementos en las anotaciones. Así que en la práctica probablemente no exista ese problema con Java EE 7 y JDK 7.

Cuestiones relacionadas