關(guān)于maven工程多模塊、項目打包問題
1、在同一父工程下的情況
(1)找到主類,主類就是你要運行那個作為啟動類就是主類,就在主類的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啥也不加,因為spring-boot-maven-plugin的原理就是打成可運行jar包,
可運行jar包就是如圖這樣的,帶BOOT-INF。注意這種文件要是你的子模塊也打成了BOOT,那么主類啟動是掃描不到的,
因為springboot是掃描的com.什么什么的,和你配置的包掃描是沖突的
最后,以此類推,有多少子模塊就這樣設(shè)置,最后package就行了
2、不在同一父工程下的情況
(就是分開的2個項目,2個有父工程的,坑就是這種一個項目打包另外一項目,另外一項目的包都是帶BOO-INF的),當(dāng)你想這個工程引入另外父工程下的子模塊時。
- 第一個項目
- 第二個項目
當(dāng)你第2個項目想依賴第1個項目的子模塊項目時
打出來的包是這樣的
# 上面這是個大坑,因為你第二個項目跑起來,他是掃描不到這個子模塊的bean的
解決辦法
(1)去第1個 項目的子模塊的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)把這個包單獨打出來放在你要跑的第2個項目的的資源里路徑里
(3)在對第2個項目進行打包時,把這個通過系統(tǒng)路徑方式導(dǎo)入進來,在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>
這樣,再 次打包之后項目是這樣的
其實意思就是你要想辦法把包路徑搞成com.xx.xxx,同級的。假如這個XXXXX的jar包又依賴了他自己父工程下的其它自己開發(fā)的坐標(biāo)(沒事,把其它2個打成依賴和它放這同一級目錄即可)
補充
還有一點就是,在maven中,假如A依賴B, B依賴C, A項目直接依賴B的坐標(biāo),打包生成的A包,那么A項目會導(dǎo)2次C,假如C中有注入Bean,就容易發(fā)生循環(huán)依賴或者依賴沖突,因為注入了不止一個實例。
可以用下面的方式在A的pom里排一次C的依賴,那么在A的lib里就不會再有C,而只讓B里有C,但是這種只限于C是單純的沒有注入bean的情況,假如有注入bean的注解,放B里去了,那么A是掃不到C的,一般不會套這種2層結(jié)構(gòu),只是今天遇到了。
一般還是項目的父工程和子模塊不要搞相互依賴的情況,直接寫一起不好嗎?!!每個子模塊作為單獨功能單獨的服務(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄
這篇文章主要介紹了SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08