Maven: разрешить диапазон версий в свойство - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть проект Java, который упаковывает некоторые файлы ресурсов в jar артефакта. Файлы поступают из zip-файла, который является версионным и хранится в той же артефакте, что и артефакт проекта. Zip упоминается как зависимость с диапазоном версий.

Почтовый индекс указан как зависимость:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>resource-files</artifactId>
    <version>[1.68.0,1.68.1)</version>
    <type>zip</type>
    <scope>provided</scope>
</dependency>

Затем распаковывается с плагином зависимости:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includes>**/*.bin</includes>
                <outputDirectory>${basedir}/import</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Затем добавлено в качестве ресурса к банке:

<resource>
    <directory>${project.basedir}/import/resource-files-${version????}</directory>
    <includes>
        <include>*</include>
    </includes>
    <targetPath>bins</targetPath>
</resource>

Как определить точную версию артефакта zip? Я хотел бы пропустить модификацию pom (например, версии: resol-range has), если это возможно.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Ну, это было весело ...

Я нашел 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>) все ресурсы правильно скопированы, и нет необходимости что-либо жестко кодировать.

Хотя это может быть не самый элегантный способ ...

0 голосов
/ 01 апреля 2019

Вы можете использовать параметр stripVersion

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includes>**/*.bin</includes>
                <outputDirectory>${basedir}/import</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...