java - 如何在不到处指定版本的情况下拥有一个多模块 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>
解决方案
在您的多模块项目中,您通常只对所有模块使用一个版本。这意味着您可以定义在构建期间解析<version>${project.version}</version>
属性的模块之间的依赖关系。${project.version}$
Maven 以正确的顺序构建所有模块。
推荐阅读
- arrays - 如何从json中获取第二个元素
- java - 生成由实例变量传递的随机数的 Java 方法
- angular - module 在本地声明组件,但未导出
- angular - 通过@syncfusion/ej2-angular-calendars 在 ejs-datetimepicker 中将 datetimepicker 输入字段默认设置为空
- c++ - 编译我的代码时出错,未定义对 Class::Method() 的引用;
- c++ - C++ 对象不保存变量值
- c# - 如何在 .NET Core 3 的 Controller 的构造函数中访问 HttpContext?
- angular - 获取Angular中更改事件的选定选项值
- ml.net - ML.Net:具有多个输出的 ONNX 模型 - 推理时间差
- build - VS2019中build和Clean&Rebuild有什么区别