将父pom中的Maven子模块作为依赖项



我正在尝试创建一个包含多个模块的maven spring启动项目。我创建了一个封装类型为pom的父模块和许多封装类型为jar的子模块。

所以我父母的pom.xml看起来像:

<groupId>Creator</groupId>
<artifactId>DPAI</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>starter</module>
<module>DatabaseApi</module>
...
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

其中一个子模块:starter只包含用@SpringBootApplicatoion注释的启动类,在其pom.xml中有一个部分包含其他子工件,如:

<parent>
<artifactId>DPAI</artifactId>        
<groupId>Creator</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>starter</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>Creator</groupId>
<artifactId>DatabaseApi</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>

所以我试图进行一些重构,并将Main.class和所有依赖项移到我父母的pom中,但它不会编译时出错,因为我的依赖项引用了它自己。

在我看来,问题是我的父pom包含有自己子模块的部分。子模块的父模块是相同的pom,我试图在其中添加所描述的依赖

parent.com不能包含任何java代码,只能包含Maven细节,例如参见:https://howtodoinjava.com/maven/maven-parent-child-pom-example/#parent-内容

也许告诉我们,你想要实现什么。

在Maven多模块项目中,您通常有一个父Pom(带有打包Pom(和几个模块,它们与您已经设置的项目级别相同。构建不依赖于您的代码的模块首先,依赖的模块:在您的父Pom中,将模块的顺序更改为

<modules>
<module>DatabaseApi</module>
<module>starter</module>
...
</modules>

所以我正在尝试进行一些重构并移动Main.class和所有依赖于我父母的pom

我认为这是不可能的。你的父pom实际上是pom类型,这意味着你实际上不应该在其中有任何java代码。它意味着保存你的子模块中使用的jar版本。您可以将其与spring-boot父模块关联起来。当我们在spring启动项目中声明spring启动父模块时,您将项目添加为spring启动父的子模块。父级将管理所有依赖项的版本。

我认为最好的方法是在spring引导模块中维护所有与服务相关的代码。过滤器、控制器等。其他东西,比如jdbc,集成层可以在其他子模块中维护,然后作为类似于您的示例的jar引用引用spring模块。

所以我正在尝试进行一些重构并移动Main.class和所有依赖于我父母的pom,

我不能100%确定Maven是否会在父POM中支持以下内容:

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>DatabaseApi</artifactId>
<version>${project.version}</version>
</dependency>
...
</dependencies>

但可以肯定的是,它不会支持带有pom封装的模块中的Java类(如父模块或多模块模块(。默认情况下,编译器:编译目标等不绑定到pom封装的任何阶段。换句话说:默认情况下,Maven不会为pom模块编译Java类。

我的建议:将SpringBootApplication保存在一个基于Java的模块中。对于SpringMVC/WebFlux应用程序,我通常会创建一个"-web"模块,其中包含:

  • SpringBootApplication
  • web服务控制器
  • http/web筛选器
  • 全局配置,例如:security、swagger、async
  • application.yml

它也是我配置Spring Boot插件以创建可执行JAR的模块。

最新更新