JAVA ·

SpringBoot 项目多模块(Module)的运用以及设计

这个SpringBoot项目的模块区分有:

panther -- 父项
panther-common -- 通用包
panther-system -- 系统管理模块
----------------------------------
panther-web -- SpringBootApplication项panther 父项关联所有子Module
panther-common 被 panther-system 所依赖
panther-system 被 panther-web 所依赖

整个项目的模块区分是作为整个系统的按功能区域进行区分。

例如:system 就是系统管理模块,后续根据业务的发展会有

panther-order -- 订单管理

panther-business -- 业务管理

...

这里面会存在每个模块管理自己独有的dao/service/model/crontoller

好了,我们开始创建项目。

一、创建父项目

1、使用 Spring Initializr 来快速创建好一个Maven工程

注意:我们这里Type选择Maven POM(这样就会创建只有pom.xml文件的maven项目)

根据填写,依次 next 就可以。

二、创建子项目(Module

1、对着项目panther右键 New - Module,选择Maven,其他什么都不需要选,填写相关信息,Next至Finish

注意:web项目需要用Spring Initializr来创建,跟父项目一样,唯一不同的是Type选择Maven Project

2、依次创建相关的子项目,改造我们父项的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>com.zhuang</groupId>
    <artifactId>panther</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 模块说明:这里声明多个子模块 -->
    <modules>
        <module>panther-common</module>
        <module>panther-system</module>
        <module>panther-web</module>
    </modules>
    <packaging>pom</packaging>

    <name>panther</name>
    <description>This is Panther Project For SpringBoot. </description>

    <!-- 继承说明:这里继承SpringBoot提供的父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/>
    </parent>

    <!-- 声明相应的版本信息,为了方便在dependency中引用版本号的时候可使用${java.version} -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <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-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <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-web</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

panther-common 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>panther</artifactId>
        <groupId>com.zhuang</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>panther-common</artifactId>
    <description>This is Panther Common Project. </description>

</project>

panther-system 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>com.zhuang</groupId>
    <artifactId>panther-system</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>panther-system</name>
    <description>This is Panther System Project. </description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入common 通用包 -->
        <dependency>
            <groupId>com.zhuang</groupId>
            <artifactId>panther-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

panther-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zhuang</groupId>
    <artifactId>panther-web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>panther-web</name>
    <description>This is Panther Web Project. </description>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.zhuang</groupId>
        <artifactId>panther</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入 system 项目包 -->
        <dependency>
            <groupId>com.zhuang</groupId>
            <artifactId>panther-system</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.zhuang.PantherWebApplication</mainClass>
                    <fork>true</fork>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

三、编写代码

1、以上几个项目的pom.xml都关联完了,我们来简单测下

启动类:PantherWebApplication

package com.zhuang;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication
    public class PantherWebApplication {

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

用户接口:IUserService (panther-system)

package com.zhuang.service;

    public interface IUserService {
        public String test();
    }

用户接口实现类:UserSerivceImpl (panther-system)

package com.zhuang.service.impl;

    import com.zhuang.service.IUserService;
    import com.zhuang.utils.DateUtils;
    import org.springframework.stereotype.Service;

    @Service
    public class UserServiceImpl implements IUserService {
        public String test() {
            return "Hello, This is Panther Project For SpringBoot,  ToDay : " + DateUtils.getDateTime("");
        }
    }

用户控制:UserController (panther-system)

package com.zhuang.controller;

    import com.zhuang.service.IUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class UserController {

        @Autowired
        private IUserService userService;

        @RequestMapping("/hello")
        public String hello() {
            return userService.test();
        }
    }

时间工具包:DateUtils (panther-common)

package com.zhuang.utils;

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    public class DateUtils {
        /**
        * 根据自定格式获取当前日期:pattern:YYYYMMDD
        * @param pattern 时间的格式:YYYYMMDD或yyyyMMddkkmmssSSS等
        */
        public static String getDateTime(String pattern) {
            if (pattern == null || "".equals(pattern)) {
                pattern = "yyyy-MM-dd";
            }
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            Calendar rightNow = Calendar.getInstance();
            rightNow.add(Calendar.DAY_OF_MONTH, 0);
            String dt = sdf.format(rightNow.getTime());
            return dt;
        }
    }

配置文件:application.yml (pather-web)

# 服务端口
    server:
        port: 820

四、运行一下试试看吧

编写完相关代码,我们就可以知道我们一些项目的代码关联

运行项目:启动类:PantherWebApplication

浏览器访问:http://localhost:820/hello 就能看到UserServiceIml return回来的String。

好了,我们整体的项目搭建就基本完毕了。

剩下的就是一些在system 模块中进行业务开发了。

注:其中这里面就是每个类似system的项目(例如后面开发的order/business等)都需要引入common包,会造成了被重复引用。

不知道有什么好的方法,只需要一次引用,能被多个项目所使用呢。欢迎留言指点迷津,谢谢。

本文只作为记录进行学习。仅供参考。

参与评论