【问题标题】:How to release Maven multi-module project with inter-project dependencies?如何发布具有项目间依赖关系的 Maven 多模块项目?
【发布时间】:2011-07-07 05:00:43
【问题描述】:

假设我们有 3 层项目。 DB、业务、Web 和聚合 pom。

Project  
|-DB  
| |-pom.xml  
|-Business  
| |-pom.xml  
|-pom.xml

所有模块都要一起发布和分支,所以聚合器 pom 被配置为将相同的版本分配给所有子模块。我们有以下版本:

DB-0.1-SNAPSHOT  
Business-0.1-SNAPSHOT which depends on DB-0.1-SNAPSHOT  
Web-0.1-SNAPSHOT which depends on Business-0.1-SNAPSHOT  

在做release:prepare时,所有版本都更新到0.1,但是由于还没有DB-0.1依赖,准备失败。

一种解决方案是为每个模块创建不同的项目并一个一个发布,同时使用versions:use-releases插件更新依赖到0.1

但我不喜欢这个想法,因为它需要大量的配置和脚本。因此,我更喜欢使用聚合并使用单个命令发布所有模块,但问题是,正如我上面所写,当发布插件尝试构建 Business-0.1 时,存储库中还没有 DB-0.1

有没有办法管理这些项目间的依赖关系?

谢谢。

更新:

即使安装目标失败。

  1. 数据库构建 - 正常(任何存储库中都没有快照或发布版本)
  2. 业务 - 失败(在存储库中未找到 DB-0.1-SNAPSHOT。但它甚至不应该存在!)

我正在使用 maven 3.0.2 并发布插件 2.1

【问题讨论】:

  • 您已将 Business 和 DB 列为父 POM 的模块,对吗?而且您正在父 POM 上运行 release:prepare only ,对吗?您描述的功能通常是开箱即用的。
  • 是的,它运行 IF 业务依赖于存储库中已经存在的一些旧版本的数据库。但是,如果您尝试引用无法在存储库中的新版本,因为它甚至还没有构建,那么不,它不起作用..
  • 它不需要在 repo 中 - Maven 将首先查看它的“反应器”(即当前构建的模块)。

标签: maven aggregation dependency-management maven-release-plugin multi-module


【解决方案1】:

对于多模块项目,当子快照依赖失败时,试试这个 发布:清洁发布:准备发布:执行-DignoreSnapshots=true

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我能够使用 Maven 3.3.9 成功地做到这一点......但让我描述一下我的案例场景:

    我使用一个名为 Liferay 的 Java 框架,其中有一个名为 Service Builder 的工具,它可以使用 Maven 构建和部署服务,其结构与您描述的完全相同:

    Service Layer
    |-pom.xml (version 1.12.0-SNAPSHOT)
    |-Service Portlet
    | |-pom.xml (version 1.16.0-SNAPSHOT)<---   
    |-Service                               | Artifact dependency
    | |-pom.xml (version 1.5.0-SNAPSHOT)-----
    

    如您所见,portlet 应用程序模块是使用作为依赖项的服务构建的,该依赖项是一个 .jar 文件,其中包含接口以及其他内容以使服务工作。

    顺便说一句,我使用不同版本的模块在我的项目中做到了这一点。我发现了一篇关于这种做法的有趣文章:Releasing modules of a multi-module project with independent version numbers。您可以阅读摘要以得出关于版本控制模块是否合适的结论......但从我的角度来看,在阅读了客户的需求后,我认为模块的版本控制应该是一个支持的功能似乎是合理的由 Maven 实现,而不会太痛苦。

    在父级(服务层)内运行 mvn release:preparemvn:perform 是可行的方法。 Maven按以下顺序进行发布构建和部署:1)父pom 2)服务依赖3)服务portlet。

    Maven 负责订单,这很好...但是服务依赖项是基于 portlet 源代码构建的,目标是在父项目中运行:mvn liferay:build-service...所以依赖项是受 portlet 应用程序源代码的影响(听起来有点疯狂)。就我而言,这是一个棘手的部分。

    那么我们如何构建和部署服务依赖项以供服务 portlet 使用呢?

    这个问题的解决方案是使用 maven-release-plugin 中的配置,允许 Maven 在任何项目的release:perform 阶段运行特定目标。我所做的是在父 pom.xml(服务层)的 maven-release-plugin 声明中添加此配置:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-release-plugin</artifactId>
      <version>2.5.2</version>
      <configuration>
       <goals>clean liferay:build-service deploy</goals>
      </configuration>
    </plugin>
    

    Maven 能够使用我们首选的版本号部署父模块和每个子模块(系统会要求您输入它们)。

    总结答案和建议:尝试使用&lt;goals&gt; 配置并在父级运行mvn release:preparemvn release:perform

    应按照顺序部署父模块和模块。

    我希望这至少能在 5 年后激励处于类似情况的人。

    【讨论】:

      【解决方案3】:

      您的项目应该只在父(项目)中定义一次版本。并让所有其他模块具有父关系。这意味着您没有聚合。你有一个多模块构建。

      Project  
      |-pom.xml (version 0.1-SNAPSHOT)
      |-DB  
      | |-pom.xml (parent: ..)
      |-Business  
      | |-pom.xml (parent:..)
      

      这将解决您的问题(也许您可以使用look here as an example)。

      【讨论】:

      • 每个模块都引用了父 'parent-testcom.lookin2.test0.0.14-SNAPSHOT ' 我配置了一个发布插件来为每个模块设置父版本。问题是业务依赖于尚未在存储库中的数据库版本。如果我将此依赖项设置为已经在存储库中的某个旧版本,那么一切正常。我只是在尝试发布整个项目的新版本时遇到问题。
      • 您使用的是哪个 Maven 版本?你可以给 pom sn-ps 特别是引用数据库依赖项吗?
      • 这个答案没有解决一个模块(例如业务)如何依赖另一个模块(例如数据库)并在发布过程中自动更新该依赖关系。
      • 同意,这个答案根本没有解决问题。
      • @Dima 你为什么接受这个答案?也许您可以详细说明它是如何解决您的问题的?
      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2013-06-15
      • 2020-01-12
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多