我正在尝试创建一个具有多个模块的Maven spring-boot项目。我创建了一个包装类型为 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包含带有其自身子模块的section。该子模块的父级是同一pom,我尝试在其中添加描述的依赖项
答案 0 :(得分:2)
parent.pom不能包含任何Java代码,只能包含Maven的特定信息,例如参见:https://howtodoinjava.com/maven/maven-parent-child-pom-example/#parent-content
也许告诉我们您想要实现的目标。
答案 1 :(得分:0)
在Maven多模块项目中,通常已经有一个父Pom(带有包装Pom),并且在已经建立项目的同一级别中有多个模块。 首先,构建不依赖代码的模块,即依赖模块:在父Pom中,将模块的顺序更改为
<modules>
<module>DatabaseApi</module>
<module>starter</module>
...
</modules>
答案 2 :(得分:0)
所以我正在尝试进行一些重构并将Main.class和所有 依赖于我父母的pom,
我不确定100%Maven是否在父POM本身中支持以下内容:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>DatabaseApi</artifactId>
<version>${project.version}</version>
</dependency>
...
</dependencies>
但是可以肯定的是,它不会在带有pom打包的模块(例如父模块或多模块模块)中支持Java类。编译器:编译目标等为not bound to any phase for pom-packaging by default。换句话说:默认情况下,Maven不会为pom-modules编译Java类。
我的建议: 将SpringBootApplication保留在基于Java的模块中。对于Spring MVC / WebFlux应用程序,我通常使用以下命令创建一个“ -web”模块:
这也是我配置Spring Boot插件以创建可执行JAR的模块。
答案 3 :(得分:0)
所以我正在尝试进行一些重构并将Main.class和所有 对我父母的pom的依赖
我认为这是不可能的。您的父pom实际上是pom类型的,这意味着您实际上不应该在其中包含任何Java代码。它的意思是保存子模块中使用的jar版本。您可以将其与spring-boot-parent模块关联。当我们在spring boot项目中声明spring-boot-parent模块时,您将项目添加为spring-boot-parent的子项。父级将管理您所有依赖项的版本。
我认为最好的方法是在spring-boot模块中维护所有与服务相关的代码。过滤器,控制器等诸如jdbc,集成层之类的其他内容可以在其他子模块中维护,然后将spring模块称为jar引用,类似于您的示例。