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

时间:2020-02-24 22:34:34

标签: java spring-boot maven

我正在尝试创建一个具有多个模块的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,我尝试在其中添加描述的依赖项

4 个答案:

答案 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”模块:

  • SpringBootApplication
  • 网络服务控制器
  • http /网页过滤器
  • 全局配置,例如:安全性,摇摇欲坠,异步
  • application.yml
  • ...

这也是我配置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引用,类似于您的示例。