Как исключить зависимость Maven-scoped-зависимостей из Eclipse (но сохранить ее в пути для юнит-тестов) - PullRequest
9 голосов
/ 24 февраля 2012

У меня возникли некоторые проблемы с получением Eclipse для соблюдения тестовой зависимости Maven - он обнаруживает путь компоновки и работает с компиляцией / разрешением javadoc eclipse.

Пример с библиотеками Java EE

Я использовал библиотеку javaee-api-6.0 для компиляции моего приложения Java EE.

Однако для целей модульного тестирования я хотел иметь доступ не только к API - мне нужна была реализация.Поэтому я включил встраиваемые библиотеки Glassfish с тестовой областью примерно так:

<repositories>
    <repository>
        <id>glassfish-extras-repository</id>
        <url>http://download.java.net/maven/glassfish/org/glassfish/extras</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>compile</scope>
        <type>jar</type>
    </dependency>
</dependencies>

Работает, как и ожидалось, с Maven

Насколько я понимаю, из-за <scope>test</scope> зависимости Glassfish, онне будет включен в регулярную фазу compile.

Поскольку обе зависимости будут включены в фазу test-compile, я был уверен, что ставим зависимость glassfish перед зависимостью javaee-api, чтобы первая была предпочтительнее последней при компиляции тестовых классов.,Итак, при использовании только Maven для сборки эта конфигурация не является проблемой.

Не работает должным образом в Eclipse

Однако при использовании m2e и Eclipse зависимость glassfish указана вмой путь сборки:

dependency listed on build path

Поскольку зависимость glassfish указана перед зависимостью java-ee-api, похоже, что Eclipse использует неверный lib (glassfish вместо java)-ee-api) для проверки / компиляции / поиска javadocs.(На самом деле, я не уверен на 100%, что при компиляции используется неправильная библиотека - это зависит от того, использует ли Eclipse Maven для компиляции, используемой при проверке кода, и я не знаю, так ли это или нет - нопоиск javadoc определенно ссылается на неправильную библиотеку)

Вопрос

Как я могу остановить Eclipse от использования библиотеки glassfish за исключением случаев, когда выполняются юнит-тесты?Я хочу убедиться, что мои поиски компиляции / Javadoc происходят на API, а не конкретная реализация этого API.

Ответы [ 4 ]

9 голосов
/ 20 марта 2013

Прошло много времени с тех пор, как я впервые опубликовал этот вопрос, но:

Как я могу запретить Eclipse использовать библиотеку glassfish, кроме случаев, когда выполняются юнит-тесты?* Вы не можете.Eclipse привязан к концепции одного пути сборки на проект, и m2e / m2e-wtp не может (или не будет) преодолеть это ограничение, как описано в следующей ошибке:

Область зависимостей не оказывает влиянияпри компиляции Eclipse

Обновление от 08 июня 2016 года

С выпуском JEE7 файл javaee-api jar теперь содержит реально используемые файлы классов .Это означает, что его можно использовать в тестах, и мне не нужно указывать файл glassfish-embedded-all jar перед ним в файле pom.

Так что теперь, когда Eclipse извлекает источник и javadoc из правого файла jar (т.е. javaee-api, а не glassfish-embedded-all), мне все равно, что тестовая область glassfish-embedded-all все еще находитсяclasspath в Eclipse.

Это не решение вопроса, который я первоначально предложил, но - это решение основной проблемы, с которой я столкнулся в то время.Возможно, это поможет кому-то еще.

7 голосов
/ 16 апреля 2012

Я тоже боролся с этой проблемой и наконец нашел решение.Вы установили плагин m2e, но вам также необходим соединитель m2e wtp, который по умолчанию не установлен.В зависимости от вашей версии m2e это выполняется по-разному.Для последней версии, в «Предпочтения» -> «Maven» -> «Discovery».Нажмите «Открыть каталог».Выберите разъем M2E - WTP.

После установки щелкните правой кнопкой мыши свой проект и выберите «Maven» -> «Обновить конфигурацию проекта ...»

Ваш pom.xml должен выглядеть следующим образом:

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>test</scope>
</dependency>

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

Eclipse должен успешно развернуться, модульные тесты должны выполняться в eclipse, и maven в командной строке также должен быть приемлемым.

Надеюсь, это поможет.

2 голосов
/ 25 февраля 2012

Может быть, это работает, если вы настроите плагин surefire на

  • , исключая зависимость API (которая включена как зависимость проекта), а
  • включают зависимость glasfish (невключите его в зависимости проекта)

как это:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <classpathDependencyExcludes>
                    <classpathDependencyExclude>javax:javaee-api
                    </classpathDependencyExclude>
                </classpathDependencyExcludes>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.glassfish.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.1</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Посмотрите на Настройка Classpath части плагина surefire (плагин)который выполняет тесты) site.


Из документации (внешнее исключаемое имя элемента И внутреннее исключаемое имя элемента с ' s ')

     <classpathDependencyExcludes>
        <classpathDependencyExcludes>org.apache.commons:commons-email</classpathDependencyExcludes>
      </classpathDependencyExcludes>

но я предполагаю, что это должно быть (только имя внешнего элемента с ' s '):

     <classpathDependencyExcludes>
        <classpathDependencyExclude>org.apache.commons:commons-email</classpathDependencyExclude>
      </classpathDependencyExcludes>
0 голосов
/ 24 февраля 2012

Я думаю, что со стороны затмения, если у вас нет lib в buildpath, у вас не может быть его специально для юнит-тестов или обработки ресурсов и т. Д.

Из практики - попробуйте упорядочить зависимости в pom.xml, и порядок библиотек в eclipse buildpath будет в большинстве случаев одинаковым.

...