使用 Maven 搭建 Springboot 多模块企业级项目

Posted by aclyyx on 12-10,2020

工具说明

  • 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基本配置