2012-02-14 7 views
17

Użyłem archetypu Mavena (webapp-javaee6), aby utworzyć nowy projekt Java EE 6, ale nie rozumiem, dlaczego pewne rzeczy są umieszczane w elemencie POM w postaci build. Aby być konkretnym, nie rozumiem, dlaczego javaee-endorsed-api.jar jest kopiowany do zatwierdzonego katalogu. Zgodnie z odpowiedzią na pytanie this jest to potrzebne do kompilacji, ale mój projekt kompiluje się dobrze po usunięciu powiązanego elementu plugin pod build.Projekt New Maven z użyciem archetypów: dlaczego plik javaee-endorsed-api.jar jest kopiowany w POM?

Od javax:javaee-web-api jest już dostarczona jako zależność w POM, czy nie można jej użyć do kompilacji?

<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

Osobiście wolę zacząć od [Maven Archetype Webapp] (http://maven.apache.org/guides/mini/guide-webapp.html) słodkie i proste, a następnie dodać zależności i fantazyjne rzeczy, zgodnie z wymogiem projektu wystąpić. – Nishant

Odpowiedz

5

Należy skompilować, ponieważ istnieje również zależność do tego artefaktu:

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

Maven manual page opisuje warunkiem następująco:

ten jest bardzo podobny do kompilacji, ale wskazuje, że spodziewasz się, że JDK lub kontener zapewnią zależność w środowisku wykonawczym. Na przykład podczas budowania aplikacji WWW dla Java Enterprise Edition należy ustawić zależność od interfejsu API Servlet i powiązanych interfejsów API Java EE do podanego zakresu, ponieważ kontener WWW udostępnia te klasy. Ten zakres jest dostępny tylko w kompilacyjnej i testowej ścieżce klas i nie jest przechodni.

W mojej opinii skopiowanie tej zależności nie ma wpływu na kompilację.

Jednak autor archetypu chciał z jakiegoś powodu skopiować pakiet Java EE 6 API do zatwierdzonego katalogu. Może to być pomocne, jeśli zdecydujesz się uruchomić serwer Jetty i wykonać kilka testów w "fazie testowej" (na przykład z JUnit).

Jeśli go nie używasz - po prostu go usuń.

+1

IMHO, ta odpowiedź nie rozwiązuje głównego problemu: "dlaczego plik javaee-endorsed-api.jar jest kopiowany do zatwierdzonego katalogu". –

14

[Znalezione w kwestii MARCHETYPES-35 poprzez patrząc na source of the webapp-javaee6 archetype]

Tło
Pakiet javax.annotation z JSR 250: Wspólne adnotacji jest obecny nie tylko in Java EE ale również in the JDK.

wersje stosowane
JDK 6: standardowych notacji 1,0
Java EE 6: standardowych notacji 1,1
JDK 7: standardowych notacji 1,1
Java EE 7: standardowych notacji 1,2

Problem
Podczas kompilowania projektu Java EE adnotacje z JDK mają pierwszeństwo przed adnotacjami z słoika javaee-web-api. Gdy adnotacja z interfejsu javaee-web-api definiuje nowy element, kompilator może go nie widzieć i nie powiedzie się z błędem.

Na przykład
Kiedy Java EE 6 Projekt wykorzystuje @Resource(lookup = "...") i jest skompilowany z JDK 6, to zwykle niepowodzeniem.

Wspólne adnotacje 1.1 introduces the new elementResource.lookup(). Ale zwykle kompilator widzi tylko adnotację o zasobach z JDK 6, która używa Wspólnych Adnotacji 1.0 without this element.

Rozwiązanie
było użyć argumentu <endorseddirs> kompilatora jak opisujesz. Aby zmusić kompilator do używania poprawnej wersji adnotacji.

Java EE 7
Jak rozumiem changelog for Common Annotations 1.2 dla Java EE 7, nie ma żadnych nowych elementów na adnotacji. Więc w praktyce prawdopodobnie nie ma takiego problemu z Java EE 7 i JDK 7.

Powiązane problemy