程序员社区

带你搞定SpringBoot构建分模块项目

> Hello,欢迎来到程序员社区。 今天聊一聊 带你搞定SpringBoot构建分模块项目,希望对大家有所帮助。

Java面试手册PDF下载:[点击下载最全Java面试手册](http://117.78.51.75/219-2)

写在前面

Spingboot项目对开发来说,最简单的当然是单模块开发,只有一个pom文件。但随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂,比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便。那么这里呢,我就来编程电子书汇总讲解一下如何使用SpringBoot来构建分模块项目,如果觉得有用,记得点个关注和点个赞哦

准备

我们这个项目呢使用的是Idea进行演示,JDK版本是1.8,然后准备构建的项目模块如下(我自己的习惯分的模块,这里只是用于演示,你可以按照你Java面试手册的习惯分模块)

  • entity:包含实体类目
  • dao:包括持久化类目
  • service:包含业务逻辑类目
  • web:api层面或者是视图层

这里说明一下我们这里的web可以理解成应用层,其他子模块理解为公共层,然后这样的话,我们可以有多个web层(web1、web2…),这样我就可以就可以实现多个应用服务集成在一起(更确切的说,叫做同一个业务分离详细,比如一个企业管理系统,拆分成财务系统、人事系统等等),不过要注意了,这样做的话,创建子模块的时候,除了web模块以外,要删除其他模块的Applicatin启动项,和resources目录下的application.properties配置文件。

这三个模块依赖的关系如下

  • web依赖entity、dao、service
  • service依赖dao、entity
  • dao依赖entity
  • entity独立,谁都不依赖

创建父工程

首先呢,我们先通过Idea的Spring Initilazr创建一个啥场景启动器都不包含的空SpringBoot项目,然后把下图所示的多余文件全部删掉,只剩下一个pom.xml,当然,如果你习惯用mvn指令运行,就不要删了(Idea的工具文件删不删都无所谓,因为你运行后,idea还是会创建的)。
带你搞定SpringBoot构建分模块项目插图
到这一步,我们的父模块就创建完成,此时的pom文件内容如下,此pom即是下文所说的父pom文件

?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.springframework.boot/groupId>
		artifactId>spring-boot-starter-parent/artifactId>
		version>2.2.5.RELEASE/version>
		relativePath/> !-- lookup parent from repository -->
	/parent>
	groupId>com.example/groupId>
	artifactId>demo/artifactId>
	version>0.0.1-SNAPSHOT/version>
	name>demo/name>
	description>Demo project for Spring Boot/description>

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

	dependencies>
		dependency>
			groupId>org.springframework.boot/groupId>
			artifactId>spring-boot-starter/artifactId>
		/dependency>

		dependency>
			groupId>org.springframework.boot/groupId>
			artifactId>spring-boot-starter-test/artifactId>
			scope>test/scope>
			exclusions>
				exclusion>
					groupId>org.junit.vintage/groupId>
					artifactId>junit-vintage-engine/artifactId>
				/exclusion>
			/exclusions>
		/dependency>
	/dependencies>

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

/project>

创建子模块

我们上面创建好了父工程,现在我们可以在父工程的基础上来创建上面提到的三个子模块,子模块的创建方式很简单,具体步骤如下
带你搞定SpringBoot构建分模块项目插图1
然后我们创建一个SpringBoot空项目,啥都不选(当然,如果我们创建的模块,不需要交给SpringBoot管理,我们可以直接创建一个空的Maven项目,但是由于我们创建的)
带你搞定SpringBoot构建分模块项目插图2

此处填写的name就是我们的模块名,创建该模块时,如果第一步选中了父模块,那么此处GroupId和Version都会自动填充,如果没有自动填充,说明创建该模块的时候没有选中。
带你搞定SpringBoot构建分模块项目插图3
带你搞定SpringBoot构建分模块项目插图4
src下的启动项以及配置文件也记得删除,然后现在按照上面的步骤,把其他三个子模块都创建出来,最后创建工程如下
带你搞定SpringBoot构建分模块项目插图5

添加依赖关系

带你搞定SpringBoot构建分模块项目插图6
先说明一个注意的点,这个是父工程的pom.xml的内容,这里指出来是说我们项目的打包方式是pom,不是jar,但是你去子模块的pom.xml里就会发现,没有packing这个标签,说明是jar的形式(当然你如果不放心,也可以加packing标签过去,声明jar形式)。

然后我们现在开始配置父工程以及子模块的pom.xml依赖关系,首先是父工程的pom.xml的内容,配置内容如下,父工程中不配置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">
    !-- 继承说明:这里继承SpringBoot提供的父工程 -->
    parent>
        groupId>org.springframework.boot/groupId>
        artifactId>spring-boot-starter-parent/artifactId>
        version>2.2.5.RELEASE/version>
        relativePath/> !-- lookup parent from repository -->
    /parent>

    !-- 项目说明:这里作为聚合工程的父工程 -->
    groupId>com.example/groupId>
    artifactId>demo/artifactId>
    version>0.0.1-SNAPSHOT/version>

    !-- 基本信息 -->
    modelVersion>4.0.0/modelVersion>
    packaging>pom/packaging>
    name>demo/name>
    description>Demo project for Spring Boot/description>

    properties>
        java.version>1.8/java.version>
        demo.version>0.0.1-SNAPSHOT/demo.version>
    /properties>

    !-- 模块说明:这里声明多个子模块 -->
    modules>
        module>dao/module>
        module>entity/module>
        module>service/module>
        module>web/module>
    /modules>

    !-- 版本说明:这里统一管理依赖的版本号 -->
    dependencyManagement>
        dependencies>
            dependency>
                groupId>com.example/groupId>
                artifactId>dao/artifactId>
                version>${demo.version}/version>
            /dependency>
            dependency>
                groupId>com.example/groupId>
                artifactId>entity/artifactId>
                version>${demo.version}/version>
            /dependency>
            dependency>
                groupId>com.example/groupId>
                artifactId>service/artifactId>
                version>${demo.version}/version>
            /dependency>
            dependency>
                groupId>com.example/groupId>
                artifactId>web/artifactId>
                version>${demo.version}/version>
            /dependency>
        /dependencies>
    /dependencyManagement>
/project>


然后我这里就直接把service、dao、entity三个子模块的pom.xml内容直接贴出来

dao

?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>com.example/groupId>
        artifactId>demo/artifactId>
        version>0.0.1-SNAPSHOT/version>
        relativePath>../pom.xml/relativePath> !-- lookup parent from repository -->
    /parent>
    groupId>com.example/groupId>
    artifactId>dao/artifactId>
    version>0.0.1-SNAPSHOT/version>
    name>dao/name>
    packaging>jar/packaging>
    description>Demo project for Spring Boot/description>

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

    dependencies>
        dependency>
            groupId>com.example/groupId>
            artifactId>entity/artifactId>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter/artifactId>
        /dependency>
    /dependencies>

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

/project>

entity

?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>com.example/groupId>
        artifactId>demo/artifactId>
        version>0.0.1-SNAPSHOT/version>
        relativePath>../pom.xml/relativePath> !-- lookup parent from repository -->
    /parent>
    groupId>com.example/groupId>
    artifactId>entity/artifactId>
    version>0.0.1-SNAPSHOT/version>
    name>entity/name>
    packaging>jar/packaging>
    description>Demo project for Spring Boot/description>

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

    dependencies>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-data-jpa/artifactId>
        /dependency>
    /dependencies>

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

/project>


service

?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>com.example/groupId>
        a编程电子书汇总rtifactId>demo/artifactId>
        version>0.0.1-SNAPSHOT/version>
        relativePath>../pom.xml/relativePath> !-- lookup parent from repository -->
    /parent>
    groupId>com.example/groupId>
    artifactId>service/artifactId>
    version>0.0.1-SNAPSHOT/version>
    name>service/name>
    packaging>jar/packaging>
    description>Demo project for Spring Boot/description>

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

    dependencies>
        dependency>
            groupId>com.example/groupId>
            artifactId>entity/artifactId>
        /dependency>
        dependency>
            groupId>com.example/groupId>
            artifactId>dao/artifactId>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter/artifactId>
        /dependency>
    /dependencies>

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

/project>

现在我们来配置web应用模块,这个模块相对于其他模块比较特殊,因为它有着启动入口

?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>com.example/groupId>
        artifactId>demo/artifactId>
        version>0.0.1-SNAPSHOT/version>
        relativePath>../pom.xml/relativePath> !-- lookup parent from repository -->
    /parent>
    groupId>com.example/groupId>
    artifactId>web/artifactId>
    version>0.0.1-SNAPSHOT/version>
    name>web/name>
    packaging>jar/packaging>
    description>Demo project for Spring Boot/description>

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

    dependencies>
        dependency>
            groupId>com.example/groupId>
            artifactId>entity/artifactId>
        /dependency>
        dependency>
            groupId>com.example/groupId>
            artifactId>service/artifactId>
        /dependency>
        dependencJava面试手册y>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter/artifactId>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-web/artifactId>
        /dependency>
        dependency>
            groupId>mysql/groupId>
            artifactId>mysql-connector-java/artifactId>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-test/artifactId>
            scope>test/scope>
            exclusions>
                exclusion>
                    groupId>org.junit.vintage/groupId>
                    artifactId>junit-vintage-engine/artifactId>
                /exclusion>
            /exclusions>
        /dependency>
    /dependencies>

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

/project>

每个web模块对应一个main方法,启动时找到各自的main方法,点击启动即可,idea一般会自动检测SpringBoot程序入口,想跑哪个点哪个,最后的目录结构如下,我们可以空跑一下项目,是没有问题的,但是为了更好的理解,接下来我们编写一些测试代码进行测试。

带你搞定SpringBoot构建分模块项目插图7

编写子模块代码

Web模块

我们在web子模块中创建两个Controller类,UserController和HelloController两个类,如下
带你搞定SpringBoot构建分模块项目插图8
UserController内容如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user/*")
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("list")
    public 编程电子书汇总R list() {
        try {
            ListUser> list = userService.list();
            return R.isOk().data(userService.list());
        } catch (Exception e) {
            return R.isFail(e);
        }
    }
}

application.properties内容如下:

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

service模块

带你搞定SpringBoot构建分模块项目插图9

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserServiceImpl  implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public ListUser> list() {
        return userRepository.findAll();
    }
}

Entity模块

带你搞定SpringBoot构建分模块项目插图10

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "T_USER")
public class User {

    @Id
    @Column(name = "USERID")
    public String userId;
    @Column(name = "USERNAME")
    public String username;
    @Column(name = "PASSWORD")
    public String password;

    //Getter&Setters
}

import java.io.Serializable;

public class RT> implements Serializable {

    private static final long serialVersionUID = -4577255781088498763L;
    private static final int OK = 0;
    private static final int FAIL = 1;
    private static final int UNAUTHORIZED = 2;

    private T data; //服务端数据
    private int status = OK; //状态码
    private String msg = ""; //描述信息

    //APIS
    public static R isOk(){
        return new R();
    }
    public static R isFail(){
        return new R().status(FAIL);
    }
    public static R isFail(Throwable e){
        return isFail().msg(e);
    }
    public R msg(Throwable e){
        this.setMsg(e.toString());
        return this;
    }
    public R data(T data){
        this.setData(data);
        return this;
    }
    public R status(int status){
        this.setStatus(status);
        return this;
    }


    //Constructors
    public R() {

    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

Dao模块

带你搞定SpringBoot构建分模块项目插图11

public interface UserRepository extends JpaRepositoryUser,String> { }

启动项目之后,成功创建数据表,并返回结果,如下
带你搞定SpringBoot构建分模块项目插图12

多模块打包

多模块项目仅仅需要在启动类所在的模块添加打包插件即可!!不要在父类添加打包插件,因为那样会导致全部子模块都使用spring-boot-maven-plugin的方式来打包(例如BOOT-INF/com/example/xx),而web模块引入xx 的jar 需要的是裸露的类文件,即目录格式为(/com/example/xx)。

首先在IDE打开Maven插件,然后在聚合父工程中点击 clean ,然后点击 package 进行打包。如图:

带你搞定SpringBoot构建分模块项目插图13

带你搞定SpringBoot构建分模块项目插图14

带你搞定SpringBoot构建分模块项目插图15

> 时间不一定能证明很多东西,但是一定能看透很多东西。坚信自己的选择,不动摇,使劲跑,明天会更好。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 带你搞定SpringBoot构建分模块项目

一个分享Java & Python知识的社区