關(guān)于maven工程多模塊、項(xiàng)目打包問題
1、在同一父工程下的情況
(1)找到主類,主類就是你要運(yùn)行那個作為啟動類就是主類,就在主類的pom里加上如下配置
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> # 下面幾行不重要,重要的是上面2行 <includeSystemScope>true</includeSystemScope> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
(2)這個主類你依賴了其它模塊
<dependency> <groupId>com.cdyx</groupId> <artifactId>medica-auth</artifactId> <version>1.0.0</version> </dependency>
那么子模塊的,這個medica-auth模塊的pom的build啥也不加,因?yàn)閟pring-boot-maven-plugin的原理就是打成可運(yùn)行jar包,
可運(yùn)行jar包就是如圖這樣的,帶BOOT-INF。注意這種文件要是你的子模塊也打成了BOOT,那么主類啟動是掃描不到的,
因?yàn)閟pringboot是掃描的com.什么什么的,和你配置的包掃描是沖突的
最后,以此類推,有多少子模塊就這樣設(shè)置,最后package就行了
2、不在同一父工程下的情況
(就是分開的2個項(xiàng)目,2個有父工程的,坑就是這種一個項(xiàng)目打包另外一項(xiàng)目,另外一項(xiàng)目的包都是帶BOO-INF的),當(dāng)你想這個工程引入另外父工程下的子模塊時。
- 第一個項(xiàng)目
- 第二個項(xiàng)目
當(dāng)你第2個項(xiàng)目想依賴第1個項(xiàng)目的子模塊項(xiàng)目時
打出來的包是這樣的
# 上面這是個大坑,因?yàn)槟愕诙€項(xiàng)目跑起來,他是掃描不到這個子模塊的bean的
解決辦法
(1)去第1個 項(xiàng)目的子模塊的pom里加這個, true意思是打成class,不打成BOO-INF
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
(2)把這個包單獨(dú)打出來放在你要跑的第2個項(xiàng)目的的資源里路徑里
(3)在對第2個項(xiàng)目進(jìn)行打包時,把這個通過系統(tǒng)路徑方式導(dǎo)入進(jìn)來,在pom里加
<dependency> <groupId>com.XXX</groupId> <artifactId>XXXXX</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/medica-auth-1.0.0.jar</systemPath> </dependency>
這樣,再 次打包之后項(xiàng)目是這樣的
其實(shí)意思就是你要想辦法把包路徑搞成com.xx.xxx,同級的。假如這個XXXXX的jar包又依賴了他自己父工程下的其它自己開發(fā)的坐標(biāo)(沒事,把其它2個打成依賴和它放這同一級目錄即可)
補(bǔ)充
還有一點(diǎn)就是,在maven中,假如A依賴B, B依賴C, A項(xiàng)目直接依賴B的坐標(biāo),打包生成的A包,那么A項(xiàng)目會導(dǎo)2次C,假如C中有注入Bean,就容易發(fā)生循環(huán)依賴或者依賴沖突,因?yàn)樽⑷肓瞬恢挂粋€實(shí)例。
可以用下面的方式在A的pom里排一次C的依賴,那么在A的lib里就不會再有C,而只讓B里有C,但是這種只限于C是單純的沒有注入bean的情況,假如有注入bean的注解,放B里去了,那么A是掃不到C的,一般不會套這種2層結(jié)構(gòu),只是今天遇到了。
一般還是項(xiàng)目的父工程和子模塊不要搞相互依賴的情況,直接寫一起不好嗎??。∶總€子模塊作為單獨(dú)功能單獨(dú)的服務(wù)才符合微服務(wù)的思想
#排除依賴 <dependency> <groupId>com.cdyx</groupId> <artifactId>medica-auth</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.cdyx</groupId> <artifactId>medica-security</artifactId> </exclusion> </exclusions> </dependency>
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程中的單例模式兩種實(shí)現(xiàn)方式
這篇文章主要介紹了Java多線程中的單例模式兩種實(shí)現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下2017-04-04SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄
這篇文章主要介紹了SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08