8

假设我们有 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

4

3 回答 3

4

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

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

这将解决你的问题(也许你可以看看这里作为一个例子)。

于 2011-03-02T13:26:48.947 回答
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 文件,其中包含接口以使服务工作。

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

在父级(服务层)内部运行是要走的路mvn release:preparemvn:performMaven 按以下顺序进行发布构建和部署: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:preparemvn release:perform运行

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

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

于 2016-07-19T21:08:35.607 回答
1

对于多模块项目,当子快照依赖项失败时,请尝试此版本:clean release:prepare release:perform -DignoreSnapshots=true

希望能帮助到你。

于 2017-04-21T07:22:59.313 回答