工具说明

  • IDEA 2020.2.1
  • Maven 3.6.3
  • Springboot 2.4.0

操作步骤

创建一个空的 Maven 项目

在 IDEA 中选择新建项目,窗口中选择 Maven 项目。
maven_spring_multi_01

填写项目名称。
maven_spring_multi_02

这里,我们对 Maven 项目的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.example</groupId>-->
<!-- <artifactId>multi</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->

<!-- 修改为 -->
    <groupId>org.example.multi</groupId>
    <artifactId>root</artifactId>
    <version>1</version>
</project>

创建一个 Spring boot 模块( Module )

这次新建一个 Module 并选在Spring Initializr
maven_spring_multi_03

输入项目信息Next
maven_spring_multi_04

选在所需的依赖包 Finish
maven_spring_multi_05

模块创建后,将模块添加到项目的 root 模块中,并将今后可能共有的依赖包复制到 root 模块的 pom.xml 里。

ROOT 的 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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.aclyyx.multi</groupId>
    <artifactId>root</artifactId>
    <version>1</version>
    <!-- 注意:这里要定义为 pom -->
    <packaging>pom</packaging>

    <!-- 模块引用 -->
    <modules>
        <module>multi-web</module>
    </modules>

    <!-- 并将今后可能共有的依赖包复制到 root 模块 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

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>
    <!-- 原本父节点为 org.springframework.boot:spring-boot-starter-parent-->
    <parent>
        <groupId>com.aclyyx.multi</groupId>
        <artifactId>root</artifactId>
        <version>1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aclyyx.multi</groupId>
    <artifactId>multi-web</artifactId>
    <version>1</version>
    <name>multi-web</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

测试模块可用性 1

在 WEB 模块创建一个 Controller 类,内容如下:



package com.aclyyx.multi.multiweb.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("demo")
public class DemoController {

    @GetMapping("hi")
    public String hi() {
        return "HI !";
    }
}

创建后,运行 WEB 模块的 Application 类,启动 SpringBoot 服务,在浏览器查看http://127.0.0.1:8080/demo/hi
maven_spring_multi_06

成功!

创建一个空模块,并填写功能代码

这回,不再是通过Spring Initializr创建了,而是选择 Maven 工程。
maven_spring_multi_07

Parent 工程选在 root 。

maven_spring_multi_08

M1 模块的 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">
    <parent>
        <artifactId>root</artifactId>
        <groupId>com.aclyyx.multi</groupId>
        <version>1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>multi-module1</artifactId>
</project>

测试模块可用性 2

在 M1 模块创建 Java 包名:com.aclyyx.multi.m1

新建一个常量类,如下:



package com.aclyyx.multi.m1;

public interface M1Constants {

    public final static String M1_HI = "M1 say HI !";
}

在 WEB 模块的 pom.xml 中添加对 M1 的依赖



    <!-- 对 M1 模块的依赖关系 -->
    <dependencies>
        <dependency>
            <groupId>com.aclyyx.multi</groupId>
            <artifactId>multi-module1</artifactId>
            <version>1</version>
        </dependency>
    </dependencies>

修改 DemoController 的返回信息,如下:



import com.aclyyx.multi.m1.M1Constants;

@RestController
@RequestMapping("demo")
public class DemoController {

    @GetMapping("hi")
    public String hi() {
        // 返回在 M1 模块中定义的常量
        return M1Constants.M1_HI;
    }
}

启动服务查看结果。
maven_spring_multi_09

配置 Spring boot 模块

现在虽然可以引用一个项目中不同模块的类了,但 spring boot 的模块还是不可以扫描到的,这里需要在启动类上通过注解添加扫描位置:@ComponentScan



@SpringBootApplication
@ComponentScan(basePackages = "com.aclyyx.multi")
public class MultiWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MultiWebApplication.class, args);
    }

}

测试模块可用性 3

在 M1 模块添加 Controller 类并重启查看效果。

Controller 代码:



@RestController
@RequestMapping("m1")
public class M1DemoController {

    @GetMapping("hi")
    public String hi() {
        return M1Constants.HI_IN_M1;
    }
}

效果:
maven_spring_multi_10

参考

Maven学习 搭建多模块企业级项目 maven工程下包含多个maven工程
springboot多模块依赖注入,访问controller时404问题
java – SpringBoot ComponentScan与多模块项目有关
SpringBoot安全管理--(一)SpringSecurity基本配置