如何使用 Spring Boot 创建多模块项目

x33g5p2x  于2022-09-16 转载在 Spring  
字(10.3k)|赞(0)|评价(0)|浏览(223)

在本文中,我们将看到**如何使用 *Spring Boot 创建多模块项目。***我们将在这个多模块应用程序中创建 2 个项目,其中一个父项目作为容器。

介绍

在我们进入更多细节之前,让我们回答一个简单的问题“Spring Boot 中多模块项目有什么好处呢?”。以下是使用 Spring Boot 的多模块项目的一些好处

  • 提供使用单个命令构建所有模块的能力。从父模块运行构建命令。
  • 构建系统负责构建顺序。
  • 使部署应用程序变得简单灵活。
  • 您可以在不同的项目中重复使用模块中的代码。

1. Spring Boot 父模块

开始我们的spring boot多模块项目,第一步是创建一个简单的父项目。该父模块包含一个 pom.xml 文件,我们的 pom.xml 将包含以下详细信息:

1.所有模块列表(实际项目)。

  1. 跨所有模块的公共依赖列表(我们不需要在所有模块上复制它)。
    1.所有模块的通用配置(例如java版本等)

作为 Spring Boot 应用程序的一部分,我们还将添加 spring-boot-starter-parent 依赖项。它是父 POM,为基于 Spring Boot 的应用程序提供依赖和插件管理。此步骤是可选的,但强烈建议用于 Spring Boot 应用程序。要创建父项目,我们有以下 2 个选项:

1.手动创建pom.xml
1.使用maven快速启动原型

让我们使用第二个选项来生成父项目。

mvn archetype:generate -DgroupId=com.javadevjournal
        -DartifactId=spring-boot-multi-module-project
        -DarchetypeArtifactId=maven-archetype-quickstart
        -DinteractiveMode=false

运行上述命令后,Maven 将为我们创建一个结构以及 pom.xml 文件。将此父模块的包装类型更改为 pom。这就是最终的 pom.xml 的样子。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.javadevjournal</groupId>
   <artifactId>spring-boot-multi-module-project</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>spring-boot-multi-module-project</name>
   <url>https://www.javadevjournal.com</url>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.2.4.RELEASE</version>
   </parent>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <java-version>1.8</java-version>
   </properties>
   <modules>
      <module>jdj-core</module>
      <module>jdj-web</module>
   </modules>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>
   </dependencies>
</project>

在我们的 pom.xml 文件中,我们将 spring-boot-starter 定义为全局依赖项(因为我们在所有模块中都需要它)。我们将在项目中创建两个目录。这 2 个目录代表父 pom.xml 文件中定义的子模块。

<modules>
      <module>jdj-core</module>
      <module>jdj-web</module>
   </modules>

2. 子模块

让我们创建我们的子模块。我们可以根据我们的要求定义任何子模块。定义相互依赖的子模块(如核心模块和依赖于核心模块的web模块)或定义独立模块。模块结构没有限制或限制,完全基于个别项目需求。我们正在定义以下结构。

1.模块用jar包装。

  1. 一个依赖于我们核心模块的 web 模块。

3. 子模块——核心

让我们创建我们的核心模块。我们将在我们的核心模块中定义一个简单的客户服务。对于本文,让我们使用 Spring 初始化程序创建我们的核心模块,但您可以使用 IDE 或通过 maven 来创建它。

我没有在模块中选择任何依赖项,但您可以根据需要添加(在本节中添加特定于模块的依赖项,对于应用程序范围的依赖项,请使用父模块 pom)。单击“生成按钮”将项目下载到本地计算机。使用基于 Spring Boot 的多模块项目的最大好处之一是能够在一个地方定义全局依赖项,并让子模块重复使用这些配置而无需复制它。

这就是我们的 jdj-core pom.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.javadevjournal</groupId>
      <artifactId>spring-boot-multi-module-project</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>
   <groupId>com.javadevjournal</groupId>
   <artifactId>jdj-core</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>jdj-core</name>
   <description>Core module for our multi module Spring Boot application</description>
</project>

这个 pom.xml 的有趣部分是 <parent> 标签。此标签允许 maven 从本地存储库(或代理,如 nexus)读取父 POM,并通过合并来自父 POM 和模块 POM 的信息来创建“有效 POM”。

<parent>
   <groupId>org.javadevjournal</groupId>
   <artifactId>spring-boot-multi-module-project&lt;/artifactId>
   <version>0.0.1-SNAPSHOT</version>
</parent>
3.1 客户服务

我们正在定义一个简单的 CustomerService 类。该服务类将根据客户 ID 返回客户信息。这是一个简单的类,但展示了这些不同的模块如何在 Maven 多模块项目中协同工作。

package com.javadevjournal.service.customer;

import com.javadevjournal.data.customer.Customer;
import org.springframework.stereotype.Service;

@Service("customerService")
public class DefaultCustomerService implements CustomerService {

    @Override
    public Customer getCustomerById(String id) {
        return new Customer("Test", "Customer", id, "[email protected]");
    }
}

4. 子模块——Web

接下来,我们有 web 模块。我们的 web 模块还依赖于核心模块(用于客户服务)。我们将使用 Spring Boot 创建 Web 模块。我们可以使用 IDE 或 spring Initializr 来创建 web 模块。

这就是 pom.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.javadevjournal</groupId>
      <artifactId>spring-boot-multi-module-project</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>
   <groupId>com.javadevjournal</groupId>
   <artifactId>jdj-web</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>jdj-web</name>
   <description>Web module for our multi module Spring Boot application</description>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>com.javadevjournal</groupId>
         <artifactId>jdj-core</artifactId>
         <version>0.0.1-SNAPSHOT</version>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
      <finalName>javadev-web</finalName>
   </build>
</project>

让我们看一下我们的 web 模块中的一些重要点:

  1. 与核心模块类似,我们在 <parent> 标签的帮助下利用 Spring Boot 依赖管理。
  2. 我们将 jdj-core jar 和 Spring Boot web 模块作为附加依赖项包括在内。
<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
      <groupId>com.javadevjournal</groupId>
      <artifactId>jdj-core</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </dependency>
</dependencies>
4.1 控制器

为了测试我们的应用程序并查看多模块应用程序是如何工作的,让我们在 web 模块中创建一个简单的客户控制器,具有以下功能。

1.客户控制器将使用核心模块中定义的客户服务。
1.客服根据ID返回客户数据。

这就是 CustomerController 的样子:

@RestController
@RequestMapping("/customers")
public class CustomerController {

    @Resource(name = "customerService")
    CustomerService customerService;

    @GetMapping("/customer/{id}")
    public Customer getCustomer(@PathVariable String id) {
        return customerService.getCustomerById(id);
    }
}

5. 构建并运行应用程序

出于偏好目的,这是我们的多模块应用程序在 Java 编辑器中的外观:

要构建我们的应用程序,请转到父模块文件夹并运行 mvn clean install 命令。 Maven 将根据我们父 pom.xml 中的配置开始构建所有模块。

$ mvn clean install
INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] spring-boot-multi-module-project                                   [pom]
[INFO] jdj-core                                                           [jar]
[INFO] jdj-web                                                            [jar]
[INFO] 
[INFO] --------< org.javadevjournal:spring-boot-multi-module-project >---------
[INFO] Building spring-boot-multi-module-project 0.0.1-SNAPSHOT           [1/3]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ spring-boot-multi-module-project ---
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ spring-boot-multi-module-project ---
[INFO] Installing /Users/Javadevjournal/javadevjournal-git/Spring-Boot/spring-boot-multi-module-project/pom.xml to /Users/.m2/repository/org/javadevjournal/spring-boot-multi-module-project/0.0.1-SNAPSHOT/spring-boot-multi-module-project-0.0.1-SNAPSHOT.pom
[INFO] 
[INFO] --------------------< com.javadevjournal:jdj-core >---------------------
[INFO] Building jdj-core 0.0.1-SNAPSHOT                                   [2/3]
[INFO] --------------------------------[ jar ]---------------------------------

............

[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ jdj-web ---
[INFO] Building jar: /Users/Javadevjournal/javadevjournal-git/Spring-Boot/spring-boot-multi-module-project/jdj-web/target/javadev-web.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.2.4.RELEASE:repackage (repackage) @ jdj-web ---
[INFO] Replacing main artifact with repackaged archive
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ jdj-web ---
[INFO] Installing /Users/Javadevjournal/javadevjournal-git/Spring-Boot/spring-boot-multi-module-project/jdj-web/target/javadev-web.jar to /Users/.m2/repository/com/javadevjournal/jdj-web/0.0.1-SNAPSHOT/jdj-web-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/Javadevjournal/javadevjournal-git/Spring-Boot/spring-boot-multi-module-project/jdj-web/pom.xml to /Users/.m2/repository/com/javadevjournal/jdj-web/0.0.1-SNAPSHOT/jdj-web-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for spring-boot-multi-module-project 0.0.1-SNAPSHOT:
[INFO] 
[INFO] spring-boot-multi-module-project ................... SUCCESS [  1.476 s]
[INFO] jdj-core ........................................... SUCCESS [  3.720 s]
[INFO] jdj-web ............................................ SUCCESS [ 12.325 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  19.005 s
[INFO] Finished at: 2020-02-01T19:43:56-08:00
[INFO] ------------------------------------------------------------------------

您一定已经注意到,当构建开始时,Maven 会显示构建顺序(我们在父 pom.xml 文件中定义的)。要运行我们的应用程序,我们可以通过传递我们的应用程序名称来使用父模块中的以下命令。

mvn spring-boot:run -pl jdj-web

或者我们可以去具体的模块,不带-pl运行上面的命令。

5.1 测试应用程序。

一旦我们启动我们的应用程序,就该测试我们的应用程序了,打开 http://localhost:8080/customers/customer/1,点击 URL:

1.我们的CustomerController会被触发。
1、自定义控制器会调用jdj-core模块中定义的客服。

概括

在本文中,我们看到了**如何使用 *Spring Boot 创建多模块项目。***我们还看到了在 Spring Boot 应用程序中使用多模块 maven 项目的好处和灵活性。此应用程序的源代码可在 GitHub 上找到。

相关文章