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

Области множественной зависимости в POM

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

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

Спасибо в Advance

4b9b3361

Ответ 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. Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.