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

2022-09-02 10:17:18

我使用Maven原型()来创建一个新的Java EE 6项目,但不明白为什么某些东西被放在POM的元素中。具体来说,我不明白为什么会将 复制到认可的目录。根据这个问题的答案,这是编译所必需的,但是当我删除下的相关元素时,我的项目编译得很好。webapp-javaee6buildjavaee-endorsed-api.jarpluginbuild

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

<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>

答案 1

[在 MARCHETYPES-35 期中通过查看 webapp-javaee6 原型的源代码找到]

背景
来自 JSR 250: Common Annotations 的 javax.annotations 包不仅存在于 Java EE 中,还存在于 JDK 中

使用
的版本 JDK 6: Common Annotations 1.0
Java EE 6: Common Annotations 1.1
JDK 7: Common Annotations 1.1
Java EE 7: Common Annotations 1.2

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

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

Common Annotations 1.1 引入了新的元素 Resource.lookup()。但通常编译器只会看到JDK 6中的资源注释,该注释使用Common Annotations 1.0而没有此元素

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

JAVA EE 7
正如我所理解的Java EE 7的Common Annotations 1.2的更改日志一样,注释上没有新的元素。因此,在实践中,Java EE 7和JDK 7可能没有这样的问题。


答案 2

它应该编译,因为还有一个依赖这个工件:

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

Maven手册页提供的描述如下:

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

因此,在我看来,复制这种依赖关系对编译没有影响。

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

如果您没有使用它 - 只需将其删除即可。


推荐