Различные зависимости для разных профилей сборки

115

Можно ли иметь другой набор зависимостей в файле maven pom.xml для разных профилей?

например

mvn -P debug
mvn -P release

Я хотел бы выбрать другой jar-файл зависимостей в одном профиле, который имеет те же имена классов и разные реализации одних и тех же интерфейсов.

IZB
источник
Это можно использовать при нацеливании на разные веб-серверы. Например, при сборке для сервера JavaEE 5, который предлагает такие библиотеки, как JAXB, которые вы не должны включать в свой файл war, по сравнению со сборкой для сервера JavaEE 1.4, куда вы должны включить jar-файл JAXB.
Леонель

Ответы:

174

Процитируем документацию Maven по этому поводу :

Элемент профиля содержит как дополнительную активацию (триггер профиля), так и набор изменений, которые необходимо внести в POM, если этот профиль был активирован. Например, проект, созданный для тестовой среды, может указывать на базу данных, отличную от базы данных окончательного развертывания. Или зависимости могут быть извлечены из разных репозиториев в зависимости от используемой версии JDK. .

(Акцент мой)

Просто поместите зависимость для releaseпрофиля внутри самого объявления профиля и сделайте то же самое для debug.

<Профили>
    <Профиль>
        <id> отладка </id>
        …
        <Зависимостей>
            <dependency>… </dependency>
        </dependencies>
        …
    </ Профиль>
    <Профиль>
        <id> выпуск </id>
        …
        <Зависимостей>
            <dependency>… </dependency>
        </dependencies>
        …
    </ Профиль>
</ Профили>
Александр Димитров
источник
2
Этот метод приведет к тому, что код не будет исправлен в режиме редактирования. Если отладка активна, jar зависимостей выпуска будет отсутствовать, и код будет ошибочным. Как это решить?
brucenan 02
6
вы можете установить область зависимости для конкретного выпуска как «предоставленную» в иерархии зависимостей и сбросить область до «компиляции» в разделе профиля выпуска. Так что зависимость доступна для компиляции, но не в финальной войне за «отладочный» профиль.
uday
@uday Если бы вы поставили ответ, показывающий такой подход, я бы с удовольствием проголосовал за него
javadba
Профили IMHO бесполезны, по крайней мере, для зависимостей: IDE выдают ошибки, зависимости перестают разрешаться, приложения в итоге не работают. Я ожидал большего.
Арес
6

Ваш groupId, artifactId должен быть токенизирован в ваших профилях как свойства, и вы можете переместить свои зависимости в общий раздел.


источник
2
Это будет только в том случае, если у вас есть 1 зависимость. Если количество зависимостей различается между отладкой и выпуском, просто токенизация не сработает. В этом отношении я бы рекомендовал не токенизировать и явно определять зависимости в разделе профиля.
Марсель Овердейк
Другой ответ не сработал для меня, поскольку зависимости профиля по умолчанию все еще были включены вместе с другими конкретными зависимостями профиля. Ваш ответ сработал нормально.
Влад Михалча
@Vlad Вы удалили зависимость от основного тела POM? В противном случае вы получите его дважды. (См. Stackoverflow.com/q/24855678/6944068 о том, как убедиться, что один профиль всегда активен.)
toolforger