Maven:将版本范围解析为属性

Maven:将版本范围解析为属性,maven,Maven,我有一个Java项目,它将一些资源文件打包到工件jar中。这些文件来自一个zip,它的版本和存储在与项目工件相同的工件中。zip被引用为具有版本范围的依赖项 zip作为依赖项列出: <dependency> <groupId>com.example</groupId> <artifactId>resource-files</artifactId> <version>[1.68.0,1.68.1)<

我有一个Java项目,它将一些资源文件打包到工件jar中。这些文件来自一个zip,它的版本和存储在与项目工件相同的工件中。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>

com.example
资源文件
[1.68.0,1.68.1)
拉链
假如
然后使用依赖插件解包:

<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>

org.apache.maven.plugins
maven依赖插件
2.10
解包依赖项
生成源
解包依赖项
**/*宾先生
${basedir}/导入
然后作为资源添加到jar中:

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

${project.basedir}/import/resource files-${version???}
*
箱子
如何确定工件zip的确切版本?如果可能,我希望跳过修改pom(如版本:resolve ranges does)。

您可以使用该参数

<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>

org.apache.maven.plugins
maven依赖插件
2.10
解包依赖项
生成源
解包依赖项
**/*宾先生
${basedir}/导入
真的
这很有趣

我找到了两种获得解析版本的方法:使用一个特定的插件,或者使用一个小的groovy脚本从maven查询它

插件 有一个
依赖版本的maven插件

<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>
由于groovy maven插件很好地公开了maven的内部结构,因此可以实现各种技巧

快到了。。。 上述两种解决方案都使用已解析的版本定义了一组新的属性,但不幸的是,它们在
块中不可用。我还没有找到有关这方面的文档,但似乎在生命周期开始之前,此块中的属性已被替换,而新定义的属性此时根本不存在

我找到的唯一解决方法是显式调用
资源
插件上的
复制资源
目标:

<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>

org.apache.maven.plugins
maven资源插件
3.1.0
复制资源
复制资源
过程资源
${project.build.outputDirectory}
假的
${basedir}/import/resource files-${resolvedVersion.resource files}/lib
*
箱子
有了这个块(并替换为
),所有资源都被正确复制,无需硬编码


虽然这可能不是最优雅的方式…

[1.68.0,1.68.1)
意味着1.68.0实际版本有一个构建日期后缀,因此1.68.0.20190304或1.68.0.20190401是有效版本。StripVersion在这种情况下不起作用。resource files-directory是zip文件中的根目录(zip是用maven assembly插件创建的)。依赖插件不能剥离zip中根文件夹的某些部分(对于复制依赖项目标更有用,它可以从zipfile本身剥离版本)。好的,也许可以帮助您,但我不确定这是否适用于版本范围
<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>