首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven:将版本范围解析为属性

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

Stack Overflow用户
提问于 2019-04-01 18:09:27
回答 2查看 1.7K关注 0票数 3

我有一个Java项目,它将一些资源文件打包到工件jar中。这些文件来自一个zip,该zip的版本控制和存储在与项目的工件相同的工件中。zip被引用为具有版本范围的依赖项。

该zip将作为依赖项列出:

代码语言:javascript
复制
<dependency>
    <groupId>com.example</groupId>
    <artifactId>resource-files</artifactId>
    <version>[1.68.0,1.68.1)</version>
    <type>zip</type>
    <scope>provided</scope>
</dependency>

然后用依赖插件解包:

代码语言:javascript
复制
<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>

然后作为资源添加到jar中:

代码语言:javascript
复制
<resource>
    <directory>${project.basedir}/import/resource-files-${version????}</directory>
    <includes>
        <include>*</include>
    </includes>
    <targetPath>bins</targetPath>
</resource>

如何确定工件zip的确切版本?如果可能的话,我想跳过对pom的修改(比如版本:resolve-ranges)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-02 17:03:58

这很有趣..。

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

插件

有一个dependencyversion-maven-plugin

代码语言:javascript
复制
<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中的每个依赖项创建新属性。更多细节here

Groovy

使用一个小的groovy脚本也可以达到同样的效果:

代码语言:javascript
复制
<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>块中不可用。我还没有找到关于这方面的文档,但似乎这个块中的属性在生命周期开始之前就被替换了,而新定义的属性在那时还不存在。

我发现的唯一解决办法是在resources插件上显式调用copy-resources目标:

代码语言:javascript
复制
<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>),所有资源都被正确地复制了,并且不需要硬编码任何东西。

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

票数 3
EN

Stack Overflow用户

发布于 2019-04-02 01:21:42

您可以使用stripVersion参数

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55452645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档