首页 > 解决方案 > 如何在不到处指定版本的情况下拥有一个多模块 Maven 项目?

问题描述

我目前正在为特定项目学习 Maven。在这个项目中,我需要有多个相互依赖的模块(在类和资源的集合的意义上)。具体来说,我需要一个模块来存储面向公众的 API 的类(API 是 Java API,因为桌面程序可以在运行时加载插件),另一个用于在客户端和服务器之间共享的一组公共类但这不是 API 的一部分,当然客户端和服务器本身都需要一个模块。

使用我在 Maven 之前使用的系统(IntelliJ Idea 的构建系统),我只需使用 IntelliJ 的 GUI 创建不同的模块并设置依赖项。这很有效,因为我可以将整个 IntelliJ Idea 项目放在一个 git 存储库中,并且可以很好地跟踪所有内容,而不会大惊小怪,也不会出现任何问题。

然而,在研究如何在 Maven 中执行此操作时,我遇到了一些问题。Maven 的文档有一个部分似乎解释了如何完成类似的事情,但它的技术似乎有两个问题。当每个子项目都有自己的 pom.xml 时,需要指定它所依赖的其他子项目的版本¹。这意味着每当版本更改时,我都需要在整个项目中进行许多更改。这将(希望)非常频繁。由于我的项目将发展到拥有数百个模块是完全合理的,这显然是不切实际的。

此外,根据我的其他研究,文档技术似乎涉及 Maven 存储库。具体来说,例如,当 API 模块构建为包含在客户端和服务器模块中时,它将首先放置在本地存储库中,然后客户端和服务器模块将从那里检索它。这听起来有问题,因为 API 模块也将发布在公共存储库中(可能是 Maven 中心,我并没有真正考虑过太多——但它将在存储库中公开),而且这个存储库步骤似乎可以最终使用已发布的 jar 而不是本地的 jar 构建客户端和服务器,由于许多原因,这是有问题的。(例如,如果开发人员正在对 api jar 进行本地更改,那么在没有这些更改的情况下构建一半的项目是一个问题)。

有没有更好的方法来组合多个模块来缓解这些问题(到处都是版本,以及从 repos 中获取错误的 jar)?修改链接文档中的技术是否更好?我是否误解了某些东西并且问题不存在?

我已经检查了 DuckDuckGo 以及我可以在 StackOverflow 上找到的所有相关问题,但没有一个解决上述两个问题中的任何一个。

¹:

  <dependencies>
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

标签: javamavenintellij-idea

解决方案


在您的多模块项目中,您通常只对所有模块使用一个版本。这意味着您可以定义在构建期间解析<version>${project.version}</version>属性的模块之间的依赖关系。${project.version}$Maven 以正确的顺序构建所有模块。


推荐阅读