Springboot 2.x 構(gòu)建多模塊項目

公司一站通項目 由于使用springboot 開發(fā)后端業(yè)務(wù),涉及的模塊比較多。 大模塊(需要獨立打包部署的)分為 Web, Websocket , Task 模塊。。 而這三個模塊,又有一些公共業(yè)務(wù),包括都需要使用到 數(shù)據(jù)庫mysql 操作, rabbitmq操作,等等一系列相同業(yè)務(wù)Service.. 如果使用一個springboot 開發(fā),那么不利于業(yè)務(wù)解耦,, 重新修改某一塊的業(yè)務(wù)的時候,需要啟動所有的模塊。從而影響到其他業(yè)務(wù),這樣不利于業(yè)務(wù)的開發(fā)。。

本次搭建使用 idea開發(fā)環(huán)境。案例將以打包web模塊為例, (websocket模塊和task模塊原理相同) 模塊分層如圖:


image.png

創(chuàng)建項目流程:

  1. (1).通過idea 創(chuàng)建一個空的 maven項目做為springboot頂級父項目,由于父項目不做任何代碼編寫,可以刪除src目錄。僅僅保留 pom.xml 文件和一些 idea的索引文件.
    (2). 修改pom.xml, 案例再下面

  2. 在idea中創(chuàng)建子模塊流程


    image.png

    image.png

    依次類推 創(chuàng)建 所有的子模塊 最終idea如圖:


    image.png

3.1 修改頂級父 的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>

    <groupId>com.us764</groupId>
    <artifactId>us764-boot</artifactId>
    <version>1.0.0</version> <!-- 子項目的的<parent>標(biāo)簽中的<version>標(biāo)簽必須與該配置一致 -->
    <packaging>pom</packaging><!-- 父項目這里必須是 pom -->

    <name>us764-boot</name>
    <description>一站通主boot項目</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- 所有的子模塊 -->
    <modules>
        <module>us764boot-core</module> <!-- 核心模塊 -->
        <module>us764boot-data</module> <!-- 持久層模塊 -->
        <module>us764boot-common</module> <!-- 通用工具模塊 -->
        <module>us764boot-opex</module> <!-- 詢盤模塊 -->
        <module>us764boot-task</module> <!-- 同步管理模塊 -->
        <module>us764boot-web</module> <!-- web管理模塊 -->
        <module>us764boot-websocket</module> <!-- socket.io 廣播消息模塊 -->
        <module>us764boot-mq</module><!-- rabbitmq 模塊 -->
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <skipTests>true</skipTests>
        <us764boot.version>1.0.0</us764boot.version>

        <us764boot-core.version>1.0.0</us764boot-core.version>
        <us764boot-opex.version>1.0.0</us764boot-opex.version>
        <us764boot-common.version>1.0.0</us764boot-common.version>
        <us764boot-data.version>1.0.0</us764boot-data.version>
        <us764boot-mq.version>1.0.0</us764boot-mq.version>
        <us764boot-task.version>1.0.0</us764boot-task.version>
        <us764boot-websocket.version>1.0.0</us764boot-websocket.version>
        <us764boot-web.version>1.0.0</us764boot-web.version>

        <ganymed-ssh2.version>1.2.0</ganymed-ssh2.version>
        <mybatis-plus.version>3.3.2</mybatis-plus.version>
        <druid.version>1.1.23</druid.version>
        <netty-socketio.version>1.7.18</netty-socketio.version>
        <springdoc-openapi-ui.version>1.5.0</springdoc-openapi-ui.version>
        <ip2region.version>1.7.2</ip2region.version>
        <fastjson.version>1.2.73</fastjson.version>
        <commons-lang3.version>3.11</commons-lang3.version>
        <commons-collections4.version>4.4</commons-collections4.version>
        <java-jwt.version>3.10.3</java-jwt.version>
        <jmustache.version>1.15</jmustache.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>    <!--默認關(guān)掉單元測試 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3.2 修改不需要啟動的模塊(不需要單獨打包的模塊) 的pom文件,本文將以 us764boot-common 的 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>com.us764</groupId>
        <artifactId>us764-boot</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>us764boot-common</artifactId>
    <name>us764boot-common</name>
    <version>${us764boot-common.version}</version>
    <description>公共核心模塊</description>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>${ip2region.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-core</artifactId>
            <version>${us764boot-core.version}</version>
        </dependency>

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>${java-jwt.version}</version>
        </dependency>

        <dependency>
            <groupId>com.samskivert</groupId>
            <artifactId>jmustache</artifactId>
            <version>${jmustache.version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>${commons-collections4.version}</version>
        </dependency>


    </dependencies>

    <!--<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>-->

</project>

3.3 修改 需要打包的模塊 pom 文件,本案例以 web模塊 (websocket模塊和task模塊一樣) 為例

<?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.us764</groupId>
        <artifactId>us764-boot</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>us764boot-web</artifactId>
    <version>1.0.0</version>
    <name>us764boot-web</name>
    <description>項目對外api模塊</description>
    <packaging>jar</packaging>

    <dependencies>

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

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>${springdoc-openapi-ui.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-data</artifactId>
            <version>${us764boot-data.version}</version>
        </dependency>

        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-common</artifactId>
            <version>${us764boot-common.version}</version>
        </dependency>

        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-core</artifactId>
            <version>${us764boot-core.version}</version>
        </dependency>

        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-opex</artifactId>
            <version>${us764boot-opex.version}</version>
        </dependency>

        <dependency>
            <groupId>com.us764</groupId>
            <artifactId>us764boot-mq</artifactId>
            <version>${us764boot-mq.version}</version>
        </dependency>

    </dependencies>

    <!-- 需要打包的 web 模塊必須加上 build打包插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 打包成可執(zhí)行jar的時候,可執(zhí)行jar的名字會以這個做為后綴   我的案例會生成一個us764boot-web-1.0.0-exec.jar  這個jar就是放到生產(chǎn)環(huán)境使用的jar-->
                    <classifier>exec</classifier>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>


        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 打包排除配置文件
                <excludes>
                    <exclude>*.properties</exclude>
                    <exclude>*.yml</exclude>
                </excludes>
                -->
            </resource>
        </resources>

    </build>

</project>

3.4 由于web模塊需要依賴 其他5個小模塊,故需要配置web模塊的包掃描, 修改web模塊的入口啟動類文件。配置包掃描

package com.us764.us764bootweb;

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

@SpringBootApplication(scanBasePackages = {
    "com.us764.us764bootcommon",
    "com.us764.us764bootcore",
    "com.us764.us764bootdata",
    "com.us764.us764bootmq",
    "com.us764.us764bootopex"
}) // 這里需要配置包引入掃描,需要引入哪些模塊,就需要填寫那些模塊的包路徑。 也可以縮寫成 scanBasePackages="com.us764" 包含所有的子模塊
// 但是由于 本例的websocket和task模塊, 不在web模塊內(nèi)。故一個個加載
public class Us764bootWebApplication {

    public static void main(String[] args) {
      
        SpringApplication app = new SpringApplication(Us764bootWebApplication.class);
        app.setBannerMode(Banner.Mode.OFF);
        //app.setWebApplicationType(WebApplicationType.NONE);
        app.run(args);
    }

}

  1. 刪除 公共業(yè)務(wù)模塊 作為web模塊依賴的,無需打包模塊的啟動類文件。 本項目,則刪除 us764boot-common, us764boot-core,us764boot-mq,us764boot-opex 等模塊的啟動類文件。。。由于 us764boot-data模塊雖然也不需要單獨啟動,但是由于它引入了spring-boot-starter-data-mongodb 操作mongodb 故而不能刪除啟動類。 我也沒找到原因

5.在 父親級項目下執(zhí)行 mvn clean install 即可打包所有的子項目依賴jar , 然后在 web模塊的根目錄 執(zhí)行 mvn package , 則可完成web模塊的打包。。。打包后會將 所有需要依賴模塊 (common,data,core等子jar 集成到web模塊的 jar文件類)


image.png

打開 us764boot-web-1.0.0-exec.jar 內(nèi)的 BOOT-INFO/lib 文件夾內(nèi)可看到 其他模塊的依賴jar


image.png

項目構(gòu)建源碼的下載地址: https://gitee.com/huaiyuanwangjun/springboot/raw/master/us764-boot.zip

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容