我有一个Maven聚合器项目X,由模块A和B组成。在我的传递管道的第一阶段,我想构建X的当前快照版本,但强制所有依赖项都是发布。 (目的是确保项目处于可释放状态,其中版本不得具有快照依赖性。)
A和B将X称为其父项,并且(使事情复杂化)B将A作为依赖项。 (我配置了Maven Enforcer插件以应用Reactor Module Convergence规则。)
是否有可能说服maven-enforcer-plugin强制执行所有依赖项的发布版本,但当前reactor构建中的项目除外?
答案 0 :(得分:2)
requireReleaseDeps
的Maven Enforcer Plugin规则中内置了导入/导出机制。例如,如果您想要求所有依赖项都使用发布版本,那么位于组ID my-group-id
中的版本除外,您将拥有:
<requireReleaseDeps>
<message>No Snapshots Allowed!</message>
<excludes>
<exclude>my-group-id:*</exclude>
</excludes>
</requireReleaseDeps>
传递给包含或排除的字符串记录在AbstractStrictPatternArtifactFilter
类中:它们遵循格式[groupId]:[artifactId]:[type]:[version]
,其中每个部分也可以包含通配符*
。
如果您的reactor中的所有项目共享相同的组ID,则此方法可以正常工作。您还可以通过指定每个工件ID来添加更多<exclude>
元素以专门针对每个项目。 MENFORCER-185是一个增强请求,用于添加allowSnapshotsInReactor
布尔值并处理来自反应堆的项目与使用include / exclude的方式不同,这将提供更清晰的解决方案,但目前尚未解决。
答案 1 :(得分:1)
scijava-maven-plugin提供了一个名为requireReproducibleBuilds
的强制规则,强制执行反应堆外的所有依赖关系,同时允许反应堆模块之间的快照。
将以下内容添加到maven-enforcer-plugin
<dependencies>
部分:
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-maven-plugin</artifactId>
<version>1.0.0</version>
</dependency>
以下maven-enforcer-plugin
配置<rules>
部分:
<!--
Require builds to be reproducible.
This means no snapshot dependencies!
-->
<requireReproducibleBuilds implementation="org.scijava.maven.plugin.enforcer.RequireReproducibleBuilds">
<groupIds>org.foo,org.bar</groupIds>
</requireReproducibleBuilds>
其中org.foo
和org.bar
是要确保具有可重现的依赖结构的组件的groupIds。
有关示例配置,请参阅here。