Области множественной зависимости в POM
У меня есть зависимость в моей POM, которая должна быть настроена на "предоставлена", поэтому она не включена в компиляцию, но ее все равно можно ссылаться в моем проекте. Я хотел бы, чтобы одна и та же зависимость имела область "тест", когда я иду запускать тесты, поэтому мне не нужно вручную добавлять банку в мой путь к классам. Есть ли способ сделать это или добиться аналогичных результатов?
В основе этого лежит то, что у меня есть некоторые общие банки, которые представлены в моем каталоге lib JBOSS, поэтому я хочу использовать их и сохранить "предоставленную" область их для построенной войны. Тем не менее, когда я запускаю JUnits из командной строки, я хочу использовать банку из репозитория без добавления ее вручную в свой путь к классам.
Спасибо в Advance
Ответы
Ответ 1
От документация maven:
. Это похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер для обеспечения зависимости во время выполнения. Например, когда создание веб-приложения для Java Enterprise Edition, вы бы установить зависимость от API сервлета и связанных с ним API Java EE для область, потому что веб-контейнер предоставляет эти классы. Это область видимости доступна только на пути компиляции и тестирования, и не транзитивным.
Я проверил это для меня в maven 3.0.3. Имел ту же проблему, что мне нужно было иметь зависимость сервлета во время компиляции и тестирования, но не скомпилирована, поскольку она поставляется с распределением сервера приложений.
Ответ 2
Вы можете использовать профиль, который либо объявляет эти зависимости в качестве теста, либо как предусмотрено - в зависимости от того, что вам более удобно:
<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
Попробуйте объявить зависимость дважды, один раз с каждой областью. Работает в Maven 2.2.1.
Запутательные вещи происходят с разрешением зависимости, когда один и тот же артефакт находится в дереве зависимостей дважды с разными областями, но я не думаю, что это должно быть проблемой в вашем случае.
Ответ 4
У меня такая же проблема, причина, по которой мне нужны две области для одной и той же зависимости, - это тестирование фазы интеграции. Я использую плагин-плагин для службы остаточного обслуживания и делаю некоторые тесты JUnit во время работы причала, но я компилирую свой пакет для jboss как, где у меня уже есть "resteasy-cdi", чем отсутствует для контейнера сервлетов причала... У меня пока нет решения.
Ответ 5
Используйте maven-surefire-plugin для запуска тестов junit. Объем предоставленных услуг также будет доступен в тестовом классе.
Ответ 6
Пожалуйста, найдите точное значение областей в Maven
Я ссылался на Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
Область зависимости используется для ограничения транзитивности зависимостей, а также для влияния на путь класса, используемый для различных задач сборки.
Доступно 6 областей:
компиляции: -
Это область по умолчанию, которая используется, если ни один не указан. Зависимости компиляции доступны во всех классах проекта. Кроме того, эти зависимости распространяются на зависимые проекты.
при условии: -
Это похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса Servlet и связанных с ним API-интерфейсов Java EE для области видимости, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только в пути к компиляции и тестированию и не является транзитивной.
время выполнения: -
В этой области указывается, что зависимость не требуется для компиляции, но предназначена для выполнения. Он находится в среде выполнения и тестирует пути к классам, но не компилирует путь к классам.
тест: -
В этой области указывается, что зависимость не требуется для нормального использования приложения и доступна только для фаз компиляции и выполнения тестов.
система: -
Эта область похожа на предоставленную, за исключением того, что вы должны предоставить JAR, который содержит это явно. Артефакт всегда доступен и не просматривается в репозитории. import (доступно только в Maven 2.0.9 или новее): - Эта область используется только в зависимости от типа pom в этом разделе. Он указывает, что указанный POM должен быть заменен зависимостями в этом разделе POM. Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.