当前位置: 首页 > 知识库问答 >
问题:

Maven:确保在多项目开发中使用相同的主要父pom版本

狄安歌
2023-03-14

我们的团队有多个项目;大多数项目只是库。为了简单起见,我们假设这些库彼此不依赖,只有一个项目使用它们,例如:

Project Main:
    Project Lib-A:
        X (3rd-party library)
    Project Lib-B:
        X (3rd-party library)

为了避免“Main”中的意外,我们希望确保我们自己的所有项目都使用相同版本的第三方库,例如“Lib-A”和“Lib-B”都是使用相同版本的库X构建和测试的。

为了实现这一点,我们使用带有的父pom

问题是:增加X的版本:“Lib-a”的开发人员将X的版本从1.0增加到2.0。因此,他在父pom中更改了X的版本,增加了父pom的版本,发布了父pom,并通知“Main”的成员,他们现在应该使用新的父pom。情况是这样的:

Main - inherits from Parent:2.0 and depends on:
    Lib-A:2.0 - inherits from Parent 2.0 and depends on X:2.0
    Lib-B:1.0 - inherits from Parent 1.0 and depends on X:1.0
    X:2.0 (taken from Parent:2.0 <dependencyManagement> section)

包括“Main”在内的一切都很好,“maven enforcer plugin”没有检测到任何冲突,因为X的版本在“Main”继承的父版本2.0中明确指定。所以我们发布了“Main”。

哎呀。。。。Lib-B从来没有用X:2.0构建过。它有很好的单元测试可以发现问题,但我们从未尝试过。我们忘了更新Lib-B,在X:2.0上试用并发布了它。“Main”仍然没有问题,maven enforcer插件从未抱怨过。

问题:我们需要maven来检测是否存在继承自同一工件但不同主要版本的依赖项,并使构建失败<在我们的例子中,构建必须失败,因为“Main”和“Lib-A”继承自父:2.0,而“Lib-B”继承自父:1.0。

到目前为止,我的解决方案(一个hack):除了继承之外,还为所有项目(即“Main”、“Lib-A”和“Lib-B”)添加对父pom的显式依赖:

<dependency>
    <artifactId>Parent</artifactId>
    <type>pom</type>
    <version>${project.parent.version}</version>
</dependency>

然后使用<代码>

有没有一种更简单、更麻烦的方法可以在主版本冲突的父pom上失败<也许我们管理maven依赖关系的整个方法都是错误的,那么推荐的方法是什么呢?


更新:
在放弃之前,按照@JF Mayer的建议和这里的描述,尝试编写我自己的maven enforcer插件规则。原因:

  1. 首先,父pom信息无法从依赖项中获得,至少无法从maven的DependencyGraphBuilder构建的节点中获得
  2. 好的,我已经将我的父pom作为显式依赖项添加到子级,并尝试使用这个DependencyGraphBuilder来检测对具有不同主要版本的父级的依赖项。没门!正如也使用此类的mvn依赖:树所看到的那样,DependencyGraphBuilder没有提供所有依赖项,因此它不能用于检测依赖项冲突。这就是为什么

共有2个答案

戚建德
2023-03-14

我认为您需要的是Reactor模块收敛执行器:

https://maven.apache.org/enforcer/enforcer-rules/reactorModuleConvergence.html

它与依赖收敛规则不同。

陆涵畅
2023-03-14

为了完整起见,我自己的穷人解决方案:

>

  • 将pom类型的显式依赖项添加到每个项目的父级,以便maven-执法者-插件的

    <dependency>
        <groupId>${project.parent.groupId}</groupId>
        <artifactId>${project.parent.artifactId}</artifactId>
        <version>${project.parent.version}</version>
        <type>pom</type>
    </dependency>
    

    我对这个解决方案不是很满意,因为第2步要求“Main”的开发人员在父版本冲突的情况下使用特殊配置文件构建它。我更喜欢在重大父版本冲突时总是失败但自动忽略父pom版本中的细微差异的解决方案,我只是不知道如何实现这一点。

  •  类似资料:
    • 我希望所有子模块都继承父版本号,但子模块要求我继续对父版本号进行硬编码(ModuleA pom.xml示例): 如何将版本号放在父pom中,并让模块继承它,而不必在多个地方更新它呢?到目前为止,我已经尝试了${project.version}和${project.parent.version},但Maven似乎对此很不满意。也不能完全删除版本引用。 有人对此有很好的答案吗?

    • 我创建了几个Spring Boot项目,每个项目的POM都包括一个spring-boot-starter-parent作为父级。每当一个新版本出来,我目前需要手动更新它在每个POM。

    • 我想在eclipse下处理同一个多模块maven项目的两个不同版本。 不幸的是,当您在eclipse下导入多模块maven项目时,您可以自己更改父模块项目名称以防止冲突,但不能更改子模块项目名称。子模块作为根项目导入,以模块名称命名。显然在导入过程中无法重命名它们。 在理想情况下,我希望保持pom不变。显然,我希望保持相同的eclipse工作区。。。

    • 我试图添加依赖到我的maven项目。我想添加Spring引导配置。但是它在父标签中给出了这个错误, 项目构建错误: io.javabrains.springbootquickstart的不可解析父POM: Court-api: 0.0.1-SNAPSHOT:未能找到 org.springframework-boot: spall-boot-starter-父: pom: 1.4.2。https:/

    • 当我使用mvn install构建工件时,我看到JAR在我的.m2文件夹中构建,但是Project.version没有替换为实际版本,即1.0-Snapshot。 > 每个工件的.m2存储库中的父pom和/或子pom是否具有指定的版本,或者是否为Project.version 我是否应该在父POM中指定Project.Version作为属性。maven文档说明Project.version可由De

    • 使用可以用于基于的遗留用例,但也可以测试我们正在迁移的未来用例:。 我是否可以在每次修改POM时实现以下反应器构建?或者,类似的东西?或者,Maven仅仅是这个用例的错误工具吗? 理想情况下,我希望在一个反应器构建中实现所有功能,每个编译并与每个继承的依赖项一起使用。我知道这会使我的Maven repo处于不希望的状态,但至少我可以将反应器构建插入到我的CI,并确保我的构建在依赖平台上运行。 注意