Подтвердить что ты не робот

Новый проект Maven с использованием архетипов: почему javaee-approved-api.jar копируется в POM?

Я использовал архетип Maven (webapp-javaee6) для создания нового проекта Java EE 6, но не понимаю, почему некоторые вещи помещаются внутри элемента build POM. Чтобы быть конкретным, я не понимаю, почему javaee-endorsed-api.jar копируется в одобренный каталог. Согласно ответу на этот вопрос, это необходимо для компиляции, но мой проект компилируется отлично, когда я удаляю связанный элемент 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>
4b9b3361

Ответ 1

Он должен скомпилироваться, потому что есть также зависимость от этого артефакта:

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

Страница руководства Maven описывает при условии следующим образом:

Это похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса Servlet и связанных с ним API-интерфейсов Java EE для области видимости, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только в пути к компиляции и тестированию и не является транзитивной.

Так что, на мой взгляд, копирование этой зависимости не влияет на компиляцию.

Однако автор архетипа по какой-то причине захотел скопировать пакет API Java EE 6 в одобренный каталог. Это может быть полезно, если вы решите запустить сервер Jetty и провести некоторое тестирование в "тестовой фазе" (например, с JUnit).

Если вы не используете его - просто удалите его.

Ответ 2

[Найден в выпуске MARCHETYPES-35, посмотрев источник аршайпа webapp-javaee6]

Фон
Пакет javax.annotation из JSR 250: Common Annotations присутствует не только в 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, он обычно терпит неудачу.

Общие аннотации 1.1 представляет новый элемент Resource.lookup(). Но обычно компилятор видел только аннотацию Resource от JDK 6, которая использует Common Annotations 1.0 без этого элемента.

Решение
Использовать аргумент компилятора <endorseddirs>, как вы описали. Чтобы заставить компилятор использовать правильную версию аннотаций.

JAVA EE 7
Поскольку я понимаю журнал изменений для Common Annotations 1.2 для Java EE 7, новых аннотаций нет. Поэтому на практике, вероятно, нет такой проблемы с Java EE 7 и JDK 7.