多模块 Spring 启动应用程序

Multiple module Spring Boot app

我们有一个 Spring 具有多个模块的引导应用程序(公开 REST 服务),出于开发目的,我们使用默认的 Spring 引导构建方法 - Maven 将其构建为一个可执行文件 war 文件,其中嵌入了 Tomcat。

出于生产部署目的,这不起作用。我们已经设置了 Web 应用程序服务器,我们需要一个可以部署在这些服务器上的常规的、不可执行的 war。我已经想出了如何构建它。

我们还将在相同的生产服务器(例如 - 应用程序模拟器)上部署另一个相关的网络应用程序(war 文件)。当然,他们会使用(一些)相同的模块,所以它提出的问题是如何设置 maven 来构建 war 和它之外的模块 jar,所以其他应用程序(war部署在同一台服务器上的文件)可能对它们有依赖性。我找不到好的 explanation/example 如何做到这一点。

有什么想法、链接、博客吗?

这实际上比 Spring Boot 更像是一个 Maven 问题。当您有一个多模块项目时,Maven 仍会为每个模块创建单独的工件,因此您仍然可以在其他地方将它们作为依赖项引用。

例如,在我使用 Spring 启动的设置中,我有父项目和它下面的模块。大多数模块都是 jar 工件,一些依赖于项目中的其他模块,当然也有一些外部依赖性。通过使用父级,我们可以使用父级中的占位符标准化依赖项中使用的一些版本。由于工件仍然是单独构建和发布的,您可以在其他项目中引用它们,这就是我相信您要问的。

例如(只是主要标签而不是全部):

家长:

<groupId>com.somecompany</groupId>
<artifactId>project-parent</artifactId>
<packaging>pom</packaging>
<version>1.1.2-SNAPSHOT</version>
<modules>
    <module>module1</module>
    <module>module2</module>
</modules>

模块 1:

<parent>
    <groupId>com.somecompany</groupId>
    <artifactId>project-parent</artifactId>
    <version>1.1.2-SNAPSHOT</version>
</parent>

<groupId>com.somecompany.tools</groupId>
<artifactId>project-tools-core</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>jar</packaging>

模块 2:

<parent>
    <groupId>com.somecompany</groupId>
    <artifactId>project-parent</artifactId>
    <version>1.1.2-SNAPSHOT</version>
</parent>

<groupId>com.somecompany.apps</groupId>
<artifactId>project-webapp</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>war</packaging>
<!-- dependency on other module -->
<dependency>
    <groupId>com.somecompany.tools</groupId>
    <artifactId>project-tools-core</artifactId>
    <version>${project.version}</version>
</dependency>

一些其他项目:

<groupId>com.somecompany.apps</groupId>
<artifactId>project-webapp-services</artifactId>
<version>1.3.0-SNAPSHOT</version>
<packaging>war</packaging>
<!-- dependency on other module which is published -->
<dependency>
    <groupId>com.somecompany.tools</groupId>
    <artifactId>project-tools-core</artifactId>
    <version>1.1.1</version>
</dependency>

因此,在这种情况下,假设您已经发布了父级及其模块的 1.1.1 版,您可以让另一个项目引用任何这些已发布的工件。可能是你缺少的发布和发布步骤。