Есть ли у Maven способ получить версию зависимости как свойство?
Я использую спецификацию для импорта зависимостей из другого проекта в мой, и мне нужен способ ссылки на версию зависимости, которая уже объявлена в указанной спецификации. До сих пор я пытался перечислить версию зависимости как свойство в спецификации, но этот подход не удался, потому что свойства не импортируются с спецификациями.
Я видел, где зависимость от плагина зависимости: цель цели делает почти то, что мне нужно, но вместо того, чтобы дать мне полный путь к артефакту, мне нужна версия как свойство. Есть ли что-то, что может дать мне версию разрешенного артефакта как свойства?
ОБНОВЛЕНИЕ - "Почему бы не использовать родительский пом?"
Я обычно работаю в средах серверов приложений, где предоставленные зависимости задаются с помощью артефактов спецификации (поскольку кажется, что это стало довольно распространенным / стандартным способом распределения групп взаимосвязанных артефактов, например, widlfly). Поэтому я хочу относиться к спецификации как к единственному источнику правды. Идея сделать что-то вроде перераспределения свойства версии зависимости, которое уже было определено в спецификации, кажется неверной.
Если бы мне нужно было определить свойства в родительском pom, которые отражали среду сервера приложений, мне теперь пришлось бы беспокоиться о том, чтобы синхронизировать свойства родительского pom и свойства спецификации - почему даже в этот момент вообще есть спецификация?
Информация уже доступна в дереве зависимостей, это всего лишь вопрос ее раскрытия...
3 ответа
Не удалось найти ни одной существующей функциональности maven или плагина для этого, поэтому я разорвал старый зависимый путь-maven-plugin и изменил его для использования версий. Теперь я могу добавить плагин так:
<build>
.
.
<plugins>
.
.
<plugin>
<groupId>io.reformanda.semper</groupId>
<artifactId>dependencyversion-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>set-all</id>
<goals>
<goal>set-version</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
И получить доступ к таким свойствам:
идентификатор_группы: артефакт: тип [: классификатор].version
IE
io.undertow: прибойный-ядро:jar.version=1.3.15.Final
Проверьте README для получения дополнительной информации о том, как использовать плагин. Это доступно @ Maven Central:
<dependency>
<groupId>io.reformanda.semper</groupId>
<artifactId>dependencyversion-maven-plugin</artifactId>
<version>1.0.0</version>
</dependency>
... плагины до конца...
Краткий ответ - да, вы можете.
Подробно, ваш корневой pom.xml:
<properties>
<slf4j.version>1.7.21</slf4j.version>
</properties>
...
<dependencyManagement>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
...
</dependencyManagement>
В модулях pom.xml:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
...
</dependencies>
Также вы можете использовать значение ${slf4j.version} для фильтрации ресурсов или в конфигурациях плагинов.
Обновить
Если вы не можете использовать свойства в родительском POM, вы можете
- получить все зависимости и их версии с зависимостями: список плагинов; или же
- использовать вместе зависимость: список + antrun: запустить плагин; или же
- настроить скрипты CI-сервера, чтобы сделать это для вас (например, в этом примере); или же
- написать собственный плагин для обработки вашей версии логики.
Этот плагин maven находится на Github ( https://github.com/semper-reformanda/dependencyversion-maven-plugin) и является обязательным для всех, кто имеет дело с версиями зависимостей, например, при использовании зависимостей Webjars - вы можете ввести номера версий Webjar прямо в ваши веб-ресурсы.
Я давно искал такую функциональность, я надеюсь, что больше людей столкнется с ней и что она включится в Maven Central (я действительно думаю, что она должна прийти с Maven из коробки)