Ну, это было весело ...
Я нашел 2 способа получить разрешенные версии: использовать определенный плагин или использовать небольшой скриптовый скрипт для запроса его у maven.
Plugin
Есть dependencyversion-maven-plugin
:
<plugin>
<groupId>io.reformanda.semper</groupId>
<artifactId>dependencyversion-maven-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>set-all</id>
<goals>
<goal>set-version</goal>
</goals>
</execution>
</executions>
</plugin>
Создает новые свойства для каждой зависимости в формате groupId:artifactId:type[:classifier].version
со значением разрешенной версии. Подробнее здесь .
Groovy
того же результата можно достичь с помощью небольшого скриптового скрипта:
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>groovy-maven-plugin</artifactId>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
for (art in project.getArtifacts())
project.properties['resolvedVersion.' + art.getArtifactId()] = art.getVersion()
</source>
</configuration>
</execution>
</executions>
</plugin>
Так как плагин groovy-maven-plugin красиво раскрывает внутренности maven, могут быть реализованы все виды трюков.
Почти там ...
Оба вышеуказанных решения определяют новый набор свойств с разрешенной версией, но, к сожалению, их нельзя использовать в блоке <build><resources>
. Я не нашел документации по этому вопросу, но кажется, что свойства в этом блоке заменяются до запуска жизненного цикла, и вновь определенные свойства просто еще не существуют в этой точке.
Единственный найденный мной обходной путь - это явное обращение к цели copy-resources
для плагина resources
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<goals>
<goal>copy-resources</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<resources>
<resource>
<filtering>false</filtering>
<directory>${basedir}/import/resource-files-${resolvedVersion.resource-files}/lib</directory>
<includes>
<include>*</include>
</includes>
<targetPath>bins</targetPath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
С этим блоком (и заменой <build><resources>
) все ресурсы правильно скопированы, и нет необходимости что-либо жестко кодировать.
Хотя это может быть не самый элегантный способ ...