使用原型的新Maven项目:为什么要在POM中复制javaee-endorsed-api.jar?

时间:2012-02-14 16:10:41

标签: java maven

我使用了Maven原型(webapp-javaee6)来创建一个新的Java EE 6项目,但是不明白为什么某些东西放在POM的build元素中。具体来说,我不明白为什么javaee-endorsed-api.jar被复制到背书目录。根据{{​​3}}问题的答案,这是编译时需要的,但是当我删除plugin下的相关build元素时,我的项目编译得很好。

由于javax:javaee-web-api已作为POM中的依赖项提供,因此不能用于编译吗?

<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 个答案:

答案 0 :(得分:15)

[通过查看MARCHETYPES-35]

找到问题source of the webapp-javaee6 archetype

<强>背景
来自JSR 250:Common Annotations的包javax.annotation不仅存在in Java EE,还存在in the JDK

使用的版本
JDK 6:通用注释1.0
Java EE 6:通用注释1.1
JDK 7:通用注释1.1
Java EE 7:通用注释1.2

<强>问题
编译Java EE项目时,JDK中的注释优先于javaee-web-api jar中的注释。当来自javaee-web-api的注释定义了一个新元素时,编译器可能看不到它并因错误而失败。

例如
当Java EE 6项目使用@Resource(lookup = "...")并使用JDK 6编译时,它通常会失败。

Common Annotations 1.1 introduces the new element Resource.lookup()。但通常编译器只能看到使用Common Annotations 1.0 without this element的JDK 6中的Resource注释。

<强>解决方案
是如您所述使用<endorseddirs>编译器参数。强制编译器使用正确版本的注释。

JAVA EE 7
据我了解Java EE 7的changelog for Common Annotations 1.2,注释中没有新元素。所以在实践中,Java EE 7和JDK 7可能没有这样的问题。

答案 1 :(得分:5)

它应该编译,因为还存在对此工件的依赖:

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

Maven manual page描述 提供 ,如下所示:

  

这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。

因此,在我看来,复制此依赖项对编译没有影响。

然而,archetype的作者出于某种原因希望将Java EE 6 API包复制到endorsed目录。如果您决定启动Jetty服务器并在“测试阶段”(例如使用JUnit)中进行一些测试,这可能会有所帮助。

如果你没有使用它 - 只需删除它。