我正在使用rpm-maven-plugin构建三个包。一个父级和两个需要同一版本父级的插件。一切正常,直到我使用XY-SNAPSHOT
版本构建它。然后我的rpm版本被截断为XY
部分,但${project.version}
的值仍然是XY-SNAPSHOT。
它导致插件需要XY-SNAPSHOT
版本的父版本,而我已经安装了XY
版本。
我想知道我是否可以在“要求”部分使用“截断”版本,或强制插件不来截断我的版本......
这是我的配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>rpm-maven-plugin</artifactId>
<version>2.0.1</version>
<executions>
<execution>
<id>parent-package</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>parent-package</name>
<mappings>
(...)
</mappings>
</configuration>
</execution>
<execution>
<id>first-plugin</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>first-plugin</name>
<mappings>
(...)
</mappings>
<requires>
<require>parent-package = ${project.version}</require>
</requires>
</configuration>
</execution>
<execution>
<id>second-plugin</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>second-plugin</name>
<mappings>
(...)
</mappings>
<requires>
<require>parent-package = ${project.version}</require>
</requires>
</configuration>
</execution>
</executions>
</plugin>
答案 0 :(得分:6)
RPM规范将-
视为特殊字符。见this is the best I could find in Google
The version number is used in version comparisons. The RPM comparison algorithm
is fairly complex, but can get fooled by strange version numbers. So, your best
bet is to stick to dotted numerics, such as 1.5 or 2.3.1.1.4 or 1.0. Version
numbers such as these will compare best from within the RPM system. For example:
Version: 1.1.2
You cannot use a dash in the version number, as RPM uses the dash to separate
the Name-Version-Release elements.
因此,诸如1.0-SNAPSHOT
之类的Maven版本将不是有效的RPM版本号。
Mojo的RPM Maven插件对版本号进行了一些转换以“帮助”你。具体来说,它会删除你找到的-SNAPSHOT
,如果有-SNAPSHOT
,它会将rpm版本设置为SNAPSHOTyyyymmddHHMMSS
(请注意,该版本用于区分两个不同版本的相同版本的RPM)
您需要做的是将一些属性设置为转换的版本。有很多方法可以做到这一点。正如我在评论中建议的那样,您可以使用build-helper:regex-property
来转换属性。这种方法的缺点是,如果RPM插件修改了它用于版本转换的规则,你的正则表达式可能会让你失去同步。
正确的解决方案是使用rpm:version
目标为您设置rpm.version
属性,因此您的配置变为:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>rpm-maven-plugin</artifactId>
<version>2.0.1</version>
<executions>
<execution>
<id>properties</id>
<goals>
<goal>version</goal>
</goals>
</execution>
<execution>
<id>parent-package</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>parent-package</name>
<mappings>
(...)
</mappings>
</configuration>
</execution>
<execution>
<id>first-plugin</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>first-plugin</name>
<mappings>
(...)
</mappings>
<requires>
<require>parent-package = ${rpm.version}</require>
</requires>
</configuration>
</execution>
<execution>
<id>second-plugin</id>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<name>second-plugin</name>
<mappings>
(...)
</mappings>
<requires>
<require>parent-package = ${rpm.version}</require>
</requires>
</configuration>
</execution>
</executions>
</plugin>
如果您需要该属性具有不同的名称,请使用versionProperty
配置参数,但请记住,对于多次执行,您可能希望将其保留为默认值
答案 1 :(得分:1)
为了扩展@ StephenConnolly的优秀答案,maven和rpm版本控制策略有一些具体的差异。差异主要在于maven的版本限定符和rpm的构建(或发布)属性。
Maven将没有限定符的任何版本视为比没有限定符的版本更新。 Maven还对任何以SNAPSHOT结尾的限定符进行特殊处理。另一方面,RPM需要内部版本号并对该值进行比较。毫不奇怪,rpm对SNAPSHOT没有特殊的逻辑。
由于我们在maven工作,我们需要遵循maven的规则/行为,并确定如何按rpm来按摩值以使其工作。这意味着我们需要建立规则来按摩rpm版本值,以便根据maven限定符实现以下目标:
此外,我们希望多个SNAPSHOT版本的rpms能够识别更新(按构建日期)并正确升级。
release attribute的文档描述了实现此期望行为的规则。
欢迎您覆盖此默认行为,但我要提醒您要确保使用相同的元数据(arch,os,version,release)构建的rpm包含相同的内容。