假设我们有 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
在存储库中。有没有办法管理这些项目间的依赖关系?
谢谢。
升级版:
即使安装目标失败。
我正在使用 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:prepare
和 mvn: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:prepare
和 mvn release:perform
在父级 父模块和模块应该按照顺序部署。
我希望这至少能在 5 年后激励处于类似情况的人。
关于maven - 如何发布具有项目间依赖关系的 Maven 多模块项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166752/