我能够使用 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 文件,其中包含接口以使服务工作。
顺便说一句,我使用不同版本的模块对我的项目进行了此操作。我发现了一篇关于这种做法的有趣文章:Releating 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 中的配置,允许 Mavenrelease: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 年后激励处于类似情况的人。