我有一个Java项目,该项目将一些资源文件打包到工件jar中。这些文件来自zip,该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>
然后用依赖插件解压缩:
<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中:
<resource>
<directory>${project.basedir}/import/resource-files-${version????}</directory>
<includes>
<include>*</include>
</includes>
<targetPath>bins</targetPath>
</resource>
如何确定工件zip的确切版本?如果可能的话,我想跳过对pom的修改(就像versions:resolve-ranges一样)。
答案 0 :(得分:0)
您可以使用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>
答案 1 :(得分:0)
这很有趣...
我发现了两种获取版本的方法:使用特定的插件,或使用小的Groovy脚本从Maven中查询它。
有一个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
,其中包含已解析的版本值。更多详细信息here。
使用小的常规脚本可以实现相同的结果:
<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>
),可以正确复制所有资源,而无需进行任何硬编码。
虽然这可能不是最优雅的方式...