Многократные Области Зависимости в POM - PullRequest
33 голосов
/ 09 мая 2011

У меня есть зависимость в моем POM, которую нужно установить на «предоставленный», чтобы он не включался при компиляции, но на него все еще можно ссылаться в моем проекте.Я хотел бы, чтобы у той же зависимости была область «test», когда я запускаю тесты, чтобы мне не пришлось вручную добавлять jar в мой путь к классам.Есть ли способ сделать это или достичь аналогичных результатов?

Причина этого заключается в том, что у меня есть несколько распространенных jar-файлов, которые предоставляются в моем каталоге JBOSS lib, поэтому я хочу использовать их и сохранить "предоставленную" областьиз них за войну, которая построена.Однако, когда я запускаю JUnits из командной строки, я хочу использовать jar из хранилища, не добавляя его вручную в мой путь к классам.

Заранее спасибо

Ответы [ 6 ]

29 голосов
/ 08 февраля 2012

Из документации maven :

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

Я проверил, что это работает для меня в maven 3.0.3.У меня была та же проблема, что и при компиляции и тестировании, мне нужно было иметь зависимость от сервлета, но не скомпилировать ее, потому что она поставляется с дистрибутивом сервера приложений.

6 голосов
/ 10 мая 2011

Вы можете использовать профиль, который объявляет эти зависимости как тестовые или предоставленные - в зависимости от того, что вам удобнее:

<profiles>
    <profile>
        <id>whatever</id>
        <activation>
            <property>
                <name>env</name>
                <value>whatever</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>test</id>
        <activation>
            <property>
                <name>env</name>
                <value>test</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

Эти профили активируются установкой свойства env , но есть и другие способы, например активация по умолчанию - посмотрите здесь для этого.

3 голосов
/ 11 мая 2011

Попробуйте объявить зависимость дважды, один раз для каждой области.Работает в Maven 2.2.1.

При разрешении зависимостей происходят запутанные вещи, когда один и тот же артефакт находится в дереве зависимостей дважды с разными областями действия, но я не думаю , это должно бытьпроблема в вашем случае.

2 голосов
/ 08 июля 2013

Возникла та же проблема, причина, по которой мне нужны две области для одной и той же зависимости, заключается в тесте интегрирования фазы. Я использую плагин Jetty для службы запуска отдыха и выполняю тестирование JUnit во время работы Jetty, но я собираю свой пакет для jboss как, где у меня уже есть "resteasy-cdi", чем отсутствует для контейнера сервлета Jetty ... У меня пока нет найденного решения.

0 голосов
/ 27 мая 2016

Пожалуйста, найдите точное значение областей в Maven

Я ссылался на Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

Область зависимостей используется для ограничения транзитивности зависимости, а также для влияния на используемый путь к классамдля различных задач сборки.

Доступно 6 областей действия:

compile: -

Это область по умолчанию, используемая, если ни одна не указана.Зависимости компиляции доступны во всех classpath проекта.Кроме того, эти зависимости распространяются на зависимые проекты.

при условии: -

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

время выполнения: -

Эта область означает, что для компиляции зависимость не требуется,но для исполнения.Он находится во время выполнения и в пути к классам теста, но не в пути к классам компиляции.

test: -

Эта область означает, что зависимость не требуется для нормального использованияприложение, и доступно только для фаз компиляции и выполнения теста.

system: -

Эта область действия аналогична предоставленной, за исключением того, что вы должны предоставить JAR, которыйсодержит это явно.Артефакт всегда доступен и не просматривается в хранилище.import (доступно только в Maven 2.0.9 или более поздней версии): - Эта область используется только для зависимости типа pom в разделе.Это указывает на то, что указанное POM должно быть заменено зависимостями в разделе этого POM.Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.

0 голосов
/ 10 апреля 2013

Используйте maven-surefire-plugin для запуска ваших тестов junit.Объем предоставленного также сделает его доступным на пути к классам теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...