Maven: динамическая спецификация зависимостей

Я начал изучать Maven и у меня есть следующий вопрос:

Я хотел бы динамически указать зависимость для создания проекта maven вместо использования зависимости, указанной в POM - есть ли способ сделать это?

Итак, хотя у меня есть следующие зависимости, указанные в POM

...
<dependencies>
<dependency>
<groupId>group</groupId>
<artifactId>ProjectComponent</artifactId>
<version>1.0</version>
 </dependency>
...

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

Идея состоит в том, что я хочу сделать интеграционную сборку в Jenkins с зависимостью от последнего доступного снимка системы для конкретной ветки. Этот снимок еще не выпущен в репозиторий maven, поэтому я хотел бы получить его в Jenkins и указать зависимость для сборки mvn.

Спасибо!

ВОЗМОЖНОЕ РЕШЕНИЕ: в итоге я использовал конструкцию ${my.lib.version} и указал ее с помощью -Dmy.lib.version=1.0-SNAPSHOT" при вызове mvn. Таким образом, я могу используйте его для интеграционных сборок Jenkins, извлекая произвольные версии моментальных снимков зависимостей из svn и передавая их версии моментальных снимков в сборку интеграции pom.


person Dmitry    schedule 18.04.2012    source источник
comment
Каково ваше намерение иметь динамическую зависимость? Можете ли вы объяснить это немного больше?   -  person khmarbaise    schedule 18.04.2012
comment
@khmarbaise Идея состоит в том, что я хочу, чтобы сборка интеграции была сделана в Jenkins с зависимостью от последнего доступного снимка системы для конкретной ветки. Этот снимок еще не выпущен в репозиторий maven, поэтому я хотел бы получить его в Jenkins и указать зависимость для сборки mvn.   -  person Dmitry    schedule 18.04.2012
comment
Лучшее решение — использовать версии SNAPSHOT именно для этой цели.   -  person khmarbaise    schedule 18.04.2012
comment
@khmarbaise это тоже была моя первоначальная идея, однако я не могу обновить зависимость pom до версии SNAPSHOT, если она не выпущена.   -  person Dmitry    schedule 18.04.2012


Ответы (4)


Maven может использовать «динамически» указанное свойство (например, group.ProjectComponent.version) с помощью профилей.

<dependencies>
    <dependency>
    <groupId>group</groupId>
    <artifactId>ProjectComponent</artifactId>
    <version>${group.ProjectComponent.version}</version>
</dependency>

Поэтому, если вы создаете несколько профилей, вы можете переключаться между ними (см. ссылки maven)

Пример:

<profile>
    <id>stable-builds</id>
    <properties>
        <group.ProjectComponent.version>1.0</group.ProjectComponent.version>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>

<profile>
    <id>beta-builds</id>
    <properties>
        <group.ProjectComponent.version>2.0.Beta1</group.ProjectComponent.version>
    </properties>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
</profile>
person sten_aksel    schedule 18.04.2012
comment
Спасибо! Вы случайно не знаете, есть ли способ указать значение зависимости для mvn из командной строки? Или это потребует испортить помпоны? - person Dmitry; 18.04.2012
comment
передать системное свойство mvn clean test -Dmy.lib.version=1.0-SNAPSHOT Хотя вы можете сделать это, это может быть плохой идеей, поскольку легко заставить проект использовать произвольную версию зависимости, просто переопределив это свойство. - person Kalpak Gadre; 20.04.2012
comment
@Kal Спасибо, это именно то, что я решил сделать. - person Dmitry; 24.04.2012

В итоге я использовал конструкцию ${my.lib.version} и указал ее с помощью -Dmy.lib.version=1.0-SNAPSHOT" при вызове mvn. Таким образом, я могу использовать ее для интеграционных сборок Jenkins, выбирая произвольный снимок версий зависимостей от svn и передачи их версий снапшотов в сборку интеграции pom.

person Dmitry    schedule 24.04.2012

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

person Anton Kokarski    schedule 14.07.2015

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

person khmarbaise    schedule 18.04.2012
comment
на самом деле вы можете, вы можете указать его как -Dmy.lib.version=1.0-SNAPSHOT (как было предложено), если у вас есть зависимость в pom, написанная как ${my.lib.version} - person Dmitry; 24.04.2012
comment
Что сделает вашу сборку невоспроизводимой. Что, на мой взгляд, недопустимо. - person khmarbaise; 24.04.2012