背景
springboot項目要怎么打包,才能被其他項目GAV引入? 打成springboot的可運行jar是不行的,要用maven插件打包。
例子
springboot項目被 mvn install 打包並安裝到本地maven倉庫后,被另外一個springboot項目引入,引入后發現JAR包存在卻無法import JAR包中的類的問題。詳細情況如下
兩個項目
A(springboot)
B(springboot)
A在mvn install 到本地倉庫后,其GAV被B引入,可以看到B的庫里確實引入了A,但是卻無法使用A里的類。如下紅色
A的JAR包,看到了BOOT-INF,其他正常可以用的JAR包是沒這個目錄的。springboot打包的是springboot特有格式的jar包,即可以運行的fat jar,並不是傳統的maven的JAR包,怎么解決?
修改A項目的pom.xml,打包插件改一下,使用maven的就行了
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<!-- 要排除啟動類 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source> <!--指明源碼用的Jdk版本-->
<target>1.8</target> <!--指明打包后的Jdk版本-->
<!-- 如果發現依然排除不了,考慮先clean再install-->
<excludes>
<exclude>
com/wyf/test/sub/AopFilterSpringinterceptorOrderingApplication.java
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
注意點
1、不要將啟動類打包進去
注意!注意!注意! 要將啟動類排除掉,或刪掉或注釋掉再打包。
如果不排除,它的@SpringBootApplication注解因包含了@ComponentScan,會導致項目B如果配置掃描jar包路徑,並且掃描到這個啟動類,會拉起A項目所有bean的實例化。詳細的情況見下面的例子
A項目沒有將springboot啟動類排除並打包給B項目引入,B項目使用如下掃描規則
@ComponentScan(basePackages = {"B項目掃描路徑", "A項目路徑"},
excludeFilters = {@ComponentScan.Filter(value = {ClassInA.class}, type = FilterType.ASSIGNABLE_TYPE)})
假設 "A項目路徑" 里包含了A項目里的啟動類,由於這個啟動類有@SpringBootApplication(包含@ComponentScan),會導致 ClassInA 這個被實例化。雖然B項目里是排除ClassInA的實例化的,但是A項目卻實例化了ClassInA。最終結果就是B項目的排除沒有生效。
這里涉及到兩個@ComponentScan(一個在B項目,另一個是A項目由@SpringBootApplication所引入的@ComponentScan),這兩個是互相獨立起作用的,一個禁止一個允許,最終導致實例化了
2、排除規則不生效怎么辦?
這個寫法不生效? 先clean再install
<excludes>
<exclude>
com/wyf/test/sub/AopFilterSpringinterceptorOrderingApplication.java
</exclude>
</excludes>
————————————————
版權聲明:本文為CSDN博主「石頭StoneWang」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/w8y56f/article/details/105003980
