maven - 如何发布具有项目间依赖关系的 Maven 多模块项目?

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

假设我们有 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在存储库中。

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

谢谢。

升级版:

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

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

    最佳答案

    我能够使用 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 文件,其中包含接口(interface)以使服务工作。

    顺便说一句,我使用不同版本的模块对我的项目进行了此操作。我发现一篇关于这种做法的有趣文章: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 能够使用我们首选的版本号部署父模块和每个子模块(您将被要求输入它们)。

    总结答案和建议:尝试使用 <goals>配置和运行mvn release:preparemvn release:perform在父级

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

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

    关于maven - 如何发布具有项目间依赖关系的 Maven 多模块项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166752/

    相关文章:

    react-native - 特定于平台的依赖导入

    maven - 从针对不同操作系统的 2 个配置文件生成 2 个 jar

    maven - 无法对项目oozie-sharelib-oozie执行目标

    elasticsearch - 为每个过滤后的Elasticsearch文档运行一个子查询

    elasticsearch - Elasticsearch重要术语聚合

    mysql - 如何在 Django ORM(MySQL) 中获取最后日期的记录?

    go - 是否有任何缓存代理可用于 Golang 依赖项,因为它是现有的,例如对于 NPM(NodeJS)?

    testing - Gradle 测试依赖

    maven - 如何将Maven/Gradle项目及其所有依赖项安装到本地存储库?

    java - RESTful Jersey 404 未找到