如何在 maven pom.xml 文件中拥有另一个父依赖项以及 Spring Boot 父项?

Posted

技术标签:

【中文标题】如何在 maven pom.xml 文件中拥有另一个父依赖项以及 Spring Boot 父项?【英文标题】:How to have another parent dependency as well as Spring Boot parent in maven pom.xml file? 【发布时间】:2018-07-24 08:32:51 【问题描述】:

我目前正在开发一个 Spring Boot 多模块项目。

当你建立一个 Spring Boot 项目时,在你的 pom.xml 你需要有一个 Spring Boot 的父引用,例如

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

我想要的是我的项目是一个更广泛项目的子模块 Spring Boot 项目(即我想将它们一起打包在一个 Repo 中的一个项目文件夹下)。

现在,通常为了设置多模块项目,您将上述父 pom 信息放入您的子模块 pom.xml

但是由于需要 Spring Boot 父级作为要求,因此不可能这样做。

我已经在网上看到了一些建议,建议将我的子模块移出并将其作为一个单独的项目独立使用,但我认为这将是我现在的最后手段,除非这是唯一的方法。

有人对如何实现我想要的或我想要实现的目标是否切实可行有任何想法吗?

期待听到选项...

【问题讨论】:

【参考方案1】:

您不能有不同的父 POM。除非您想将 Boot 父级扩展到您自己的父级 POM 并从那里工作,这可能是可行的。

另一个选项是使用带有 DependencyManagement 的 Spring Boot BOM,当您想要覆盖依赖项时,它会稍微不那么简洁,例如通常你只需覆盖一个 Maven 属性。

但是,当使用 BOM 时,您需要对覆盖进行排序,然后在依赖管理标签中将引导 BOM 最后排序。 Spring Docs 中的示例,

<dependencyManagement>
<dependencies>
    <!-- Override Spring Data release train provided by Spring Boot -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-releasetrain</artifactId>
        <version>Fowler-SR2</version>
        <scope>import</scope>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.5.10.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>
</dependencyManagement>

见,https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html#using-boot-maven-without-a-parent

有关在不使用 Spring Boot Parent POM 的情况下设置 Spring Boot 项目的更多信息。

【讨论】:

这似乎是 Spring Boot 自己建议的方式。 ? 所以我接受这个作为答案 在进行进一步研究之后,似乎建议不要进行多模块项目设置,因为它违背了 Spring Boot 打算提供的目的。从表面上看,Spring Boot 似乎最适合设置为单个项目的微服务。 通常是这样,但这并不是说您不应该给出用例。我们在一个多项目中使用 BOM,它创建了一个 Spring Boot 启动器,但也使用该启动器打包了一个启动应用程序的示例实现。【参考方案2】:

您可以创建一个父 pom.xml 并在此 pom.xml 中添加 spring-boot 父级,您还必须将其他项目添加为模块

如果在模块 pom.xml 中添加父 pom.xml,则可以通过父 pom.xml 访问 spring-boot

父项目 pom.xml

...

<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>parent-project</name>
<description>Rent A Car Operation System Parent Project</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.M3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
    <module>module-1</module>
    <module>module-2</module>
    <module>module-3</module>
</modules>
...

模块项目 pom.xml

...
<name>module-1</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
...

您也不需要添加已经在父项目 pom.xml 中添加的依赖项

不要忘记父项目 pom.xml 中的&lt;packaging&gt;pom&lt;/packaging&gt;

【讨论】:

这是一个可能的解决方案,但对我来说这听起来像是一个黑客让它工作。我没有采用这种方法的原因是因为在我的用例中只有 module-1 是 Spring Boot,而其他模块不是。因此,我认为将 Spring Boot 放在根本上是没有意义的。

以上是关于如何在 maven pom.xml 文件中拥有另一个父依赖项以及 Spring Boot 父项?的主要内容,如果未能解决你的问题,请参考以下文章