可继承的Maven插件规则版本

问题描述 投票:0回答:3

当运行

mvn versions:display-dependency-updates
版本 Maven 插件时,我看到很多这样的东西:

[INFO]   org.slf4j:slf4j-api ........................... 1.7.36 -> 2.0.0-alpha7

但是仅仅因为我没有使用更高版本的 alpha 版本并不意味着我没有使用最新的可用发行版本。另一个 Stack Overflow 答案 表明我可以设置一个

rules.xml
文件来忽略像
*.-alpha*
这样的版本,将类似的内容放入我的 POM 中:

<configuration>
  <rulesUri>file:///${project.basedir}/rules.xml</rulesUri>
</configuration>

我的问题:这个

rules.xml
文件可以继承吗?如果我将其放在
<packaging>pom</packaging>
的父 POM 中的单独项目中,发布到 Maven Central,子 POM 会选择它吗?或者子项目会在子项目目录中寻找
rules.xml
文件吗?

我想在父 POM 中配置

versions-maven-plugin

(就像我已经做的那样)并在任何子 POM 或后代 POM 上运行 
mvn versions:display-dependency-updates
。如何在父 POM 中设置忽略规则,以便在检查子 POM 中的依赖项更新时选择这些版本忽略规则? (有没有办法将规则包含在 POM 本身中?)

java maven versioning
3个回答
2
投票
或者子项目会在子项目目录中查找rules.xml文件吗?

是的,如果您通过

rules.xml

 定义 
${project.basedir}
 文件,它将解析为子项目的当前本地基目录。我已经通过简单的父子 pom 设置验证了这一点。因此,除非您在每个项目中复制规则文件,否则这是行不通的。

如果您希望在父pom中包含插件配置

规则集而不复制规则文件,您有两个选择:

如果您的规则集 xml 文件托管在,例如,

http://www.mycompany.com/maven-version-rules.xml,那么您公司 pom 中的以下配置将确保所有项目都使用此规则集.

<configuration> <rulesUri>http://www.mycompany.com/maven-version-rules.xml</rulesUri> </configuration>

如果您想将规则集 xml 作为 Maven 工件分发,您也可以在 jar 中提供规则集 xml 文件。因此,您必须将包含的 jar 声明为 versions-maven-plugin 的直接依赖项,并使用类路径作为协议。

<configuration> <rulesUri>classpath:///package/foo/bar/rules.xml</rulesUri> </configuration> <dependencies> <dependency> <groupId>com.mycompany</groupId> <artifactId>version-rules</artifactId> <version>1.0</version> </dependency> </dependencies>
来源:

  • https://www.mojohaus.org/versions-maven-plugin/version-rules.html
pom 中的配置只有基本的

includes

excludes
 过滤器。这些将允许您从整体上排除任何依赖项,但不能排除特定的更新版本。据我从可用的文档中可以看出,没有办法以任何其他方式定义版本规则。

  • https://www.mojohaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html
更新09-2022

github Ticket中我们在评论中发现可以看到以下更新:

看起来像这样的功能最近已经由

#369实现了。请参阅 #318,其中可以提供包含和排除过滤器来确定将考虑哪些依赖模式。因此,您可以排除诸如 .*-beta.

.*_ALPHA
 之类的模式,尽管不使用正则表达式,而是使用简单的星号通配符。

这将在今天的版本 (2.12.0) 中发布。

这将添加以下功能:

版本 2.12.0 将引入新参数:

dependencyIncluded

dependencyExcludes
dependencyManagementIncludes
dependencyManagementExcludes

pom.xml

 中给出以下示例配置:

<profile> <id>display-dependency-updates</id> <build> <plugins> <plugin> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <executions> <execution> <phase>validate</phase> <goals> <goal>display-dependency-updates</goal> </goals> <configuration> <dependencyIncludes>org.apache.maven.*:doxia*</dependencyIncludes> <dependencyManagementIncludes>com.puppy*:*</dependencyManagementIncludes> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
这也将用于过滤 

plugin

pluginManagement
,但这可能会在以后的版本中添加:

所以,我刚刚添加了缺少的插件和插件管理过滤,其工作原理类似。不过,我真的怀疑它是否会出现在今天的版本中。


2
投票
很高兴现在可以在插件中本地使用此功能;请参阅

问题#684。我建议至少使用 v2.16.0,因为Issue #959


1
投票
从 Github 粘贴我的答案,因为我认为这可能对其他人有益。

假设您的项目中有一个名为

rules-test

 的目录,其中包含规则模板文件:

<ruleset comparisonMethod="maven" xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 https://www.mojohaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd"> <ignoreVersions> <ignoreVersion type="regex">${ignoredVersions}</ignoreVersion> </ignoreVersions> </ruleset>
然后,在您的主项目中,创建以下配置文件:

<profile> <id>rules-test</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <resources> <resource> <directory>rules-test</directory> <filtering>true</filtering> </resource> </resources> <outputDirectory>${project.basedir}</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.12.0</version> <executions> <execution> <phase>validate</phase> <goals> <goal>display-dependency-updates</goal> </goals> <configuration> <rulesUri>file://${project.basedir}/compiled-rules.xml</rulesUri> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
如果您随后执行以下 Maven 目标:

mvn -P rules-test "-DignoredVersions=.*-(M\d*|.*-SNAPSHOT)" clean validate
然后您将使用 

-DignoredVersions

 参数中的过滤器获得依赖关系报告(过滤掉 
*-M*
*-SNAPSHOT
)。

如果您将

ignoredVerions

 属性放入项目中而不是将其作为 -D 参数传递,那么它将是可继承的!

© www.soinside.com 2019 - 2024. All rights reserved.