此文已由作者易國強授權網易雲社區發布。
歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。
明確功能,各司其職
在一個結構清晰的項目中,一個沒有module划分的結構顯然不是最佳實踐。有人會說可以在同一個Project中定義不同的包名及包路徑來做區分,但這樣當功能復雜后並不可取。
當然,如果你的項目足夠簡單,比如只是提供一個很簡單的微服務,沒有分層治理的概念,那么則不需要關心這個問題了。
下面就Spring Boot環境中多module打包的注意事項列舉如下,希望對大家有所幫助。
新建所需要的module模塊,在此示例中新建兩個module,bingo-core和bingo-web。其中bingo-core作為封裝服務提供給bingo-web使用,bingo-web作為我們的工程的最終jar包提供服務。為了說明問題,我們仍然采用spring boot框架來構建這兩個module。
具體新建步驟可參考《從0到1,只需兩分鍾》這篇文章,不同的是,在新建的時候選擇新建module即可。新建完畢后,工程結構如下圖所示。注意此時父pom文件的打包方式需要變更成pom,不再是jar或者war。
通過在bingo-core中新建一個類,然后在bingo-web中使用此類以說明問題。(示例類在此省略,大家可以自己試試)
這個時候如果我們不做任何修改,直接package就會出現問題,提示找不到bingo-core中的相關類。如下圖所示:
那么問題就是這里了,這個問題和spring boot的打包方式有關系,spring boot默認將每個module打包成一個fat jar,這個jar包和我們正常使用的jar包內部的結構是不相同的,如下圖所示,fat jar包含了直接運行所需要的所有信息(包含內嵌的容器,如果是一個web應用的話),那么類的加載路徑此時就發生了變化,所以在編譯時會提示找不到引用類。
這個時候我們只需要通過配置maven的插件參數來使相關需要使用的jar打包成正常的jar包即可。修改配置如下:
在需要變更打包方式的pom.xml文件中(如在bingo-core模塊),修改插件配置如下所示:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins></build>
另外需要注意的是,需要在bingo-core/bingo-web模塊的測試類中加入@SpringBootTest注解的作用范圍,如下圖所示:
- 此時再執行maven的package命令即可發現打包成功。我們查看bingo-core打包生成的jar包可以發現,實際上會有兩個,如下圖所示,帶-exec后綴的就是我們默認的fat jar。可以直接運行的jar包。 
多module的打包方式修改比較簡單,但當出現這個問題時,如果不清楚其原因,還是比較折騰人的。
不足之處,歡迎指正,謝謝~
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 Obfuscator-llvm源碼分析