추가 - archetypes를 사용하는 새로운 Maven 프로젝트:javaee-endorsed-api.jar가 POM에 복사되는 이유는 무엇입니까?




이클립스 메이븐 업데이트 (2)

[ webapp-javaee6 archetype소스 를보고 MARCHETYPES-35 문제를 발견했습니다]

배경
JSR 250 : Common Annotations의 javax.annotation 패키지 는 Java EE 뿐만 아니라 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 에서는 새로운 요소 Resource.lookup() 소개합니다 . 그러나 일반적으로 컴파일러는 이 요소없이 Common Annotations 1.0을 사용하는 JDK 6의 Resource 주석만을 봅니다.

해결책
설명대로 <endorseddirs> 컴파일러 인수를 사용했습니다. 컴파일러가 주석의 올바른 버전을 사용하게합니다.

자바 전자 7
Java EE 7에 대한 Common Annotations 1.2변경 내역을 이해 했으므로 주석 에는 새로운 요소가 없습니다. 따라서 실제로 Java EE 7 및 JDK 7에는 이러한 문제가 없습니다.

https://code.i-harness.com

필자는 Maven 아키 타입 ( webapp-javaee6 )을 사용하여 새로운 Java EE 6 프로젝트를 만들었지 만 POM의 build 요소 안에 어떤 것들이 들어 있는지 이해하지 못합니다. 구체적으로 말하면 왜 javaee-endorsed-api.jar 이 승인 된 디렉토리로 복사되는지 이해할 수 없습니다. this 질문에 대한 대답에 따르면 컴파일에 필요하지만 build 할 때 관련 plugin 요소를 제거하면 프로젝트가 올바르게 컴파일됩니다.

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>

이 아티팩트에 대한 종속성이 있기 때문에 컴파일해야합니다.

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

Maven 매뉴얼 페이지 는 다음과 같이 제공 된다.

이것은 컴파일과 매우 비슷하지만 런타임에 JDK 또는 컨테이너가 종속성을 제공 할 것으로 기대한다는 것을 나타냅니다. 예를 들어, Java Enterprise Edition 용 웹 응용 프로그램을 빌드 할 때 웹 컨테이너가 해당 클래스를 제공하기 때문에 Servlet API 및 관련 Java EE API에 대한 종속성을 제공된 범위로 설정합니다. 이 범위는 컴파일 및 테스트 클래스 경로에서만 사용할 수 있으며 전이가 아닙니다.

그래서 내 생각에이 종속성을 복사하는 것은 컴파일에 아무런 영향을 미치지 않습니다.

그러나 archetype의 저자는 어떤 이유로 Java EE 6 API 패키지를 승인 된 디렉토리에 복사하려고합니다. Jetty 서버를 시작하고 "테스트 단계"(예 : JUnit)에서 일부 테스트를 수행하려는 경우이 방법이 유용 할 수 있습니다.

사용하지 않는 경우 제거하십시오.





maven