如何在不指定整个版本的情况下拥有一个多模块的Maven项目?

时间:2019-03-24 04:24:05

标签: java maven intellij-idea

我目前正在为特定项目学习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>

2 个答案:

答案 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>