spring一個(gè)項(xiàng)目多個(gè)模塊聚合打包問(wèn)題解決方案(最新推薦)
1.問(wèn)題描述:
最近遇到個(gè)需求,針對(duì)后端解耦模塊較多的項(xiàng)目,想在云端啟動(dòng)時(shí)簡(jiǎn)潔些只啟動(dòng)一個(gè)jar文件的情景。
1)解耦較細(xì)多個(gè)子module一個(gè)項(xiàng)目下
2)只想打到一個(gè)包啟動(dòng)一次
3)原解耦架構(gòu)不想打破、不想重構(gòu)
2.解決方案
針對(duì)此問(wèn)題spring原生自帶處理方式,下面寫(xiě)個(gè)demo
一、創(chuàng)建聚合父工程
1.首先使用 Spring Initializr 來(lái)快速創(chuàng)建好一個(gè)Maven工程。然后刪除無(wú)關(guān)的文件,只需保留pom.xml 文件。這里命名 demo-Project。
2.然后在 pom.xml 里面聲明該父工程包含的子模塊。(其它信息就不逐一講述了,諸如繼承SpringBoot官方父工程以及統(tǒng)一依賴(lài)管理 請(qǐng)查看下面的注釋說(shuō)明)
<?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.7.16</version> <relativePath/> <!-- lookup parent from repository --> </parent> <packaging>pom</packaging> <groupId>com.example</groupId> <artifactId>demo-Project</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-Project</name> <description>demo-Project</description> <modules> <module>demo-starter</module> <module>demo-one</module> <module>demo-tow</module> </modules> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- <build>--> <!-- <plugins>--> <!-- <plugin>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> <!-- </plugin>--> <!-- </plugins>--> <!-- </build>--> </project>
二、創(chuàng)建子模塊(module)
分別調(diào)整它們的pom.xml 以繼承上面的父工程。例如demo-one模塊的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> <parent> <groupId>com.example</groupId> <artifactId>demo-Project</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>com.example</groupId> <artifactId>demo-one</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-one</name> <description>demo-one</description> <properties> <java.version>8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <!-- <build>--> <!-- <plugins>--> <!-- <plugin>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> <!-- </plugin>--> <!-- </plugins>--> <!-- </build>--> </project>
三、編寫(xiě)子模塊代碼
注:正常是控制層、業(yè)務(wù)層、數(shù)據(jù)層等的解耦,目前是簡(jiǎn)單多業(yè)務(wù)架構(gòu)模式假設(shè)每模塊里都有自己的service、entity、repo、service等層次代碼只是demo簡(jiǎn)單寫(xiě)了。
1.模塊1(demo-one)
啟動(dòng)類(lèi) :DemoOneApplication.java (demo-one)
package com.example.demoone; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoOneApplication { public static void main(String[] args) { SpringApplication.run(DemoOneApplication.class, args); } }
控制器:ConTeone.java (demo-one)
package com.example.demoone.controler; import com.example.demoone.bean.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConTeone { @Autowired User user; @PostMapping("/contest1") public String test1(){ return "test1"; } @PostMapping("/contest1/onebean") public User test2(){ return user; } }
javabean User類(lèi):
package com.example.demoone.bean; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import java.io.Serializable; @Data @Component @ConfigurationProperties(prefix = "user") @JsonSerialize public class User{ String username; String password; }
配置文件:application.yml (demo-one)
server: port: 8081 user: username: admin password: admin spring: profiles: active: true
2.模塊2(demo-tow)
啟動(dòng)類(lèi) :DemoTowApplication.java (demo-tow)
package com.example.demotow; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoTowApplication { public static void main(String[] args) { SpringApplication.run(DemoTowApplication.class, args); } }
控制器:Contest.java (demo-tow)
package com.example.demotow.controler; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class Contest { @PostMapping("/contest2") public String testTow(){ return "test2"; } }
配置文件:application.yml (demo-tow) 這個(gè)不配了沒(méi)寫(xiě)特殊的東西,只是在demo-one里寫(xiě)了從yml配置好做演示。
四、創(chuàng)建聚合模塊 (demo-starter)
創(chuàng)建聚合模塊 它的pom.xml 以繼承上面的父工程。代碼為普通的spring-web的項(xiàng)目即可,擁有初始的 啟動(dòng)類(lèi)即可。但是啟動(dòng)類(lèi)需要開(kāi)啟包路徑掃描。
要求:
1)開(kāi)啟包掃描;
2)要繼承 子模塊demo-one、demo-tow;
3)要有打包插件配置 spring-boot-maven-plugin;
4)其他子模塊需要去掉打包插件 這很重要。
1. starter聚合模塊pom配置 (依賴(lài)子模塊很重要)
下圖依賴(lài)了兩個(gè)子模塊。
下圖的打包配置,最簡(jiǎn)單的配置即可,當(dāng)然看項(xiàng)目而定 有復(fù)雜需求按自己實(shí)際配置即可。
<?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.7.16</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-starter</name> <description>demo-starter</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>demo-one</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>demo-tow</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.starter聚合模塊開(kāi)啟包掃描 (很重要)
特別注意:如果子模塊包路徑和啟動(dòng)類(lèi)的根路徑一致,不加上述注解也可,我這就是一樣的但是為了演示所以還是配置了。
五、打包測(cè)試
萬(wàn)事俱備直接打包測(cè)試即可了。
在父pom的項(xiàng)目路徑下打包
mvn clean package
打出來(lái)的包 在 demo-starter所在的路徑里,當(dāng)然運(yùn)行 install 在本地倉(cāng)庫(kù)找也可;發(fā)布制品庫(kù)的話(huà)直接發(fā)布上去的也是 demo-starter;
六、最后的最后 測(cè)試一下效果
啟動(dòng) demo-starter
java -jar .\demo-starter-0.0.1-SNAPSHOT.jar
demo-one的 返回User的接口
demo-one 的返回string的接口
demo-tow的返回string的接口
到此這篇關(guān)于spring一個(gè)項(xiàng)目多個(gè)模塊聚合打包問(wèn)題解決方案的文章就介紹到這了,更多相關(guān)spring多個(gè)模塊聚合打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中的Io(input與output)操作總結(jié)(二)
這一節(jié)我們來(lái)討論關(guān)于文件自身的操作包括:創(chuàng)建文件對(duì)象、創(chuàng)建和刪除文件、文件的判斷和測(cè)試、創(chuàng)建目錄、獲取文件信息、列出文件系統(tǒng)的根目錄、列出目錄下的所有文件,等等,感興趣的朋友可以了解下2013-01-01java操作Redis緩存設(shè)置過(guò)期時(shí)間的方法
這篇文章主要介紹了java操作Redis緩存設(shè)置過(guò)期時(shí)間的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java使用反射和動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)View注解綁定庫(kù)
這篇文章主要介紹了Java使用反射和動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)View注解綁定庫(kù),代碼簡(jiǎn)潔,使用簡(jiǎn)單,擴(kuò)展性強(qiáng),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05使用java實(shí)現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Spring依賴(lài)注入的兩種方式(根據(jù)實(shí)例詳解)
這篇文章主要介紹了Spring依賴(lài)注入的兩種方式(根據(jù)實(shí)例詳解),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05Spring Boot中配置文件application.properties使用
這篇文章主要介紹了Spring Boot中配置文件application.properties使用及spring boot讀取application.properties文件的方式,需要的朋友參考下吧2018-01-01