我目前正在为特定项目学习Maven。在这个项目中,我需要有彼此依赖的多个模块(从类和资源的集合的角度来看)。具体来说,我需要一个模块来存储面向公众的API的类(该API是Java API,因为桌面程序可以在运行时加载加载项),另外一个用于在客户端和服务器之间共享的通用类集但这不是API的一部分,当然客户端和服务器本身每个都需要一个模块。
使用在Maven之前使用的系统(IntelliJ Idea的构建系统),我将简单地使用IntelliJ的GUI创建不同的模块并设置依赖项。之所以行之有效,是因为我可以将整个IntelliJ Idea项目放在git存储库中,并且可以很好地跟踪所有内容,而不必大惊小怪。
但是,在研究如何在Maven中执行此操作时,我遇到了一些问题。 Maven的文档中有a section似乎在解释如何完成类似的工作,但是其技术似乎有两个问题。当每个子项目都有自己的pom.xml时,需要指定它依赖的其他子项目的版本¹。这意味着只要版本更改,我就需要在整个项目中进行许多更改。 (希望)这会很频繁。由于我的项目将拥有数百个模块是完全合理的,因此这显然是不切实际的。
另外,根据我的其他研究,看来Maven存储库已包含在已记录的技术中。具体来说,例如,当将API模块构建为包含在客户端和服务器模块中时,它将首先放置在本地存储库中,然后客户端和服务器模块将从那里检索它。这听起来很成问题,因为API模块也将发布在公共存储库中(也许是Maven Central,我还没有真正考虑过这一点-但它将在回购中公开),并且此存储库步骤似乎可以最终使用已发布的jar而不是本地的jar构建客户端和服务器,这由于许多原因而存在问题。 (例如,如果开发人员正在对api jar进行本地更改,则在不进行这些更改的情况下构建一半的项目就是一个问题。)
是否有更好的方法来组合多个模块来减轻这些问题(到处都是版本,并从存储库中获取错误的jar)?是否最好在链接的文档中修改技术?我误会了什么,问题不存在吗?
我已经检查了DuckDuckGo和所有我可以在StackOverflow上找到的相关问题,但都没有解决上述两个问题。
¹:
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
答案 0 :(得分:1)
在多模块项目中,通常所有模块仅使用一个版本。这意味着您可以使用<version>${project.version}</version>
定义模块之间的依赖关系,其中在构建过程中解析属性${project.version}$
。 Maven以正确的顺序构建所有模块。
答案 1 :(得分:-1)
关于第一个问题:您可以在整个项目中创建一个父pom。在此父pom中,您可以添加dependencyManagement部分,您可以在其中列出自己的模块及其版本。然后,在模块中,您只需要指定依赖项即可,无需版本。
这里有个例子:
在父pom中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleA</artifactId>
<version>3.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleB</artifactId>
<version>3.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
如果您的模块A使用模块B,则可以添加模块A的pom
<dependencies>
<dependency>
<groupId>yourgroup</groupId>
<artifactId>yourmoduleB</artifactId>
</dependency>
</dependencies>