除了来自同一版本的模块之外,实施版本依赖性

时间:2016-11-14 14:41:40

标签: java maven

我有一个Maven聚合器项目X,由模块A和B组成。在我的传递管道的第一阶段,我想构建X的当前快照版本,但强制所有依赖项都是发布。 (目的是确保项目处于可释放状态,其中版本不得具有快照依赖性。)

A和B将X称为其父项,并且(使事情复杂化)B将A作为依赖项。 (我配置了Maven Enforcer插件以应用Reactor Module Convergence规则。)

是否有可能说服maven-enforcer-plugin强制执行所有依赖项的发布版本,但当前reactor构建中的项目除外?

2 个答案:

答案 0 :(得分:2)

requireReleaseDepsMaven 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.fooorg.bar是要确保具有可重现的依赖结构的组件的groupIds。

有关示例配置,请参阅here