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