springboot公共模塊打包_解決SpringBoot多模塊發布時99%的問題?

每天都會分享Java架構文章,喜歡的朋友關注我。ps:文末有彩蛋,驚喜等著你

26fb61d556ecaac59ea95243a2e8c4e1.png

如果使用的是 SpringBoot 多模塊的項目,在發布的時候可能遇到各種各樣的問題。本文歸納了以下 8 個原則和發布時經常出現的 4 個問題的解決方案,掌握了這些原則和解決方案,幾乎可以解決絕大數 SpringBoot 發布問題。

SpringBoot 多模塊發布的 8 大原則

1 在發布模塊打包,而不是父模塊上打包

比如,以下項目目錄:

5cf2df96f02962669fae0436dad43db8.png

如果要發布 api 就直接在它的模塊上打包,而不是在父模塊上打包。

2 公共調用模塊,打包類型設置為 jar 格式

公共模塊,比如 common 和 model 需要設置 packaging 為 jar 格式,在 pom.xml 配置:

jar

3 發布模塊打包類型設置為 war 格式

在發布的模塊 pom.xml 中設置:

war

4 排除內置 tomcat

在發布的模塊 pom.xml 中設置:

org.springframework.boot spring-boot-starter-tomcat provided

當設置 scope=provided 時,此 jar 包不會出現在發布的項目中,從而就排除了內置的 tomcat。

5 設置啟動類

此步驟相當于告訴 tomcat 啟動的入口在哪。需要在啟動類添加如下代碼:

@SpringBootApplicationpublic class ApiApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ApiApplication.class); } public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); }}

6 如果使用攔截器一定要排除靜態文件

比如我在項目中使用了 swagger,那我就需要排除 swagger 的靜態文件,代碼如下:

@Configurationpublic class WebMvcConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 排除靜態文件 registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } // do something}

7 先裝載公共模塊,再發布項目

如果發布的模塊引用了本項目的其他公共模塊,需要先把本項目的公共模塊裝載到本地倉庫。

操作方式,雙擊父模塊的 install 即可, install 成功之后,點擊發布模塊的 package 生成 war 包,就完成了項目的打包,如下圖所示:

0f94aa788a4a403112de5b4738eb6a60.png

8 部署項目

有了 war 包之后,只需要把單個 war 包,放入 tomcat 的 webapps 目錄,重新啟動 tomcat 即可,如下圖所示:

2f13044eb50efc60e380073be602350c.png

項目正常運行會在 webapps 目錄下生成同名的文件夾,如下圖所示:

b26f32a7a55b1855d2447f11e2b90095.png

完成以上配置,就可以 happy 的訪問自己發布的項目了。

可能出現的問題和解決方案

問題一:SpringBoot 配置了端口號影不影響程序發布?

答:不影響,配置的 server.port 會被覆蓋,以 tomcat 本身的端口號為準,tomcat 端口號在 tomcat/config/server.xml 文件中配置。

問題二:發布報錯,不能找到其他模塊或項目中的公共模塊,怎么辦?

答:因為沒有執行父節點 maven 的 install 操作,install 就是把公共模塊放入本地倉庫,提供給其它項目使用。

問題三:不能找到 SpringBoot 運行的 main 類,怎么辦?

答:因為沒有設置啟動類導致的,設置方式:

  • pom.xml 配置啟動類,配置 configuration>com.bi.api.ApiApplication 。
  • 啟動類繼承 SpringBootServletInitializer 實現 SpringApplicationBuilder 方法,具體代碼參考文中第五部分。

問題四:把 SpringBoot 項目部署到 Tomcat 7 一直提示找不到 xxx.jar 包?

答:這是因為 SpringBoot 版本太高,tomcat 版本太低的原因。如果你使用的是最新版的 SpringBoot,可以考慮把 tomcat 也升級為 tomcat 8.x+ 最新的版本,就可以解決這個問題。


彩蛋時間:免費分享Java系列技術資料,需要的朋友可以在后臺私信我

a83822f1431d22226c034cf5d1363698.png

作者:白天不懂夜的黑

鏈接:https://www.jianshu.com/p/7ab4fd0d565f

來源:知乎

聲明:本文為二次轉載,原文不可查

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541576.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541576.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541576.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tomcat7的數據庫連接池tomcatjdbc的25個優勢

tomcat的JDBC連接池org.apache.tomcat.jdbc.pool更換或替代嗎Apache Commons DBCP連接池。為什么我們須要一個新的連接池?這里有幾個原因: 1.DBCP 1.x是單線程的。為了成為線程安全的 共享鎖整個池在短時間內在兩個對象 分配和對象返回。注意,這并不適用 下議院DBCP 2.x。 2.D…

weakhashmap_Java WeakHashMap entrySet()方法與示例

weakhashmapWeakHashMap類entrySet()方法 (WeakHashMap Class entrySet() method) entrySet() method is available in java.util package. entrySet()方法在java.util包中可用。 entrySet() method is used to retrieve the mappings that exist in this map to be viewed in …

定義整型數組_C++數組的定義與初始化(學習筆記:第6章 01)

數組的定義與使用[1]數組是具有一定順序關系的若干相同類型變量的集合體,組成數組的變量稱為該數組的元素。數組的定義方括號里面列出的常量表達式是數組每一維的下標個數。數組的下標不管從哪一維它都是從0開始數的。例如:int a[10]; 表示a為整型數組&a…

我們正在經歷一個應用疲憊時代?

在移動互聯網時代到來之后,應用程序成為了智能手機必備,也正因為萬千開發者的參與,才讓移動終端充分發揮出了強大的能量,當然,這些開發者也不斷創造著造富神話,一個小團隊在幾個月的努力之后可能就會成為億…

Java LinkedHashMap values()方法與示例

LinkedHashMap類的values()方法 (LinkedHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get all the values exist in this LinkedHashMap to be viewed in a Collection.…

語句拼接_第2課:一個周末學會R語言數據處理:表拆分和拼接

從一線收集了兩百個文件,要整合到一起?總部一張全國兩百個城市的匯總表,拆成兩百個小文件?開什么玩笑,難道要復制粘貼到天荒地老。。。不用這么麻煩,一個循環,一個語句,實現快速表拆…

Anaconda配置多spyder多python環境

作者:桂。 時間:2017-04-17 22:02:37 鏈接:http://www.cnblogs.com/xingshansi/p/6725298.html 前言 最近在看《統計學習方法》,打算配合《機器學習實戰》一起,可后者的代碼是基于python2.6的: All the co…

pytorch自定義新層demo_從頭學pytorch(十一):自定義層

自定義layer不含模型參數的layer含模型參數的layer核心都一樣,自定義一個繼承自nn.Module的類,在類的forward函數里實現該layer的計算,不同的是,帶參數的layer需要用到nn.Parameter不含模型參數的layer直接繼承nn.Moduleimport torchfrom torch import nnclass CenteredLayer(n…

java日歷類add方法_Java日歷computeTime()方法及示例

java日歷類add方法日歷類computeTime()方法 (Calendar Class computeTime() method) computeTime() method is available in java.util package. java.util包中提供了computeTime()方法 。 computeTime() method is for conversion of current field values to the ms(millisec…

C++——智能指針和RAII

該文章代碼均在gitee中開源 C智能指針hpphttps://gitee.com/Ehundred/cpp-knowledge-points/tree/master/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88??????? 智能指針 傳統指針的問題 在C自定義類型中,我們為了避免內存泄漏,會采用析構函數的方法釋…

移除元素所有事件監聽_DOM 事件模型或 DOM 事件機制

DOM 事件模型DOM 的事件操作(監聽和觸發),都定義在EventTarget接口。所有節點對象都部署了這個接口,其他一些需要事件通信的瀏覽器內置對象(比如,XMLHttpRequest、AudioNode、AudioContext)也部…

gettimezone_Java日歷getTimeZone()方法與示例

gettimezone日歷類的getTimeZone()方法 (Calendar Class getTimeZone() method) getTimeZone() method is available in java.util package. getTimeZone()方法在java.util包中可用。 getTimeZone() method is used to return this Calendar time zone. getTimeZone()方法用于返…

cass展點不在原位置_cass展點之步驟及方法

cass展點之步驟及方法cass展點是根據手工或坐標正反算軟件自動計算的結果,利用cass軟件將點號、坐標及其高程自動展示到圖紙上的一種方法。其基本步驟和方法如下:一、將井下測點的點號、以及計算好的Y坐標、X坐標、及高程由sheet1復制并粘貼到sheet2上面…

Java BufferedWriter close()方法與示例

BufferedWriter類close()方法 (BufferedWriter Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to flushes the characters from the stream and later will close it by using close() metho…

ISCC2014-reverse

這是我做reverse的題解。在咱逆向之路上的mark一下,,水平有限,大牛見笑。題目及題解鏈接:http://pan.baidu.com/s/1gd3k2RL 宗女齊姜 果然是僅僅有50分的難度,OD直接找到了flag. 找到殺手 這題用OD做非常麻煩。我改用I…

python 獲取當前時間再往前幾個月_Python 中的時間和日期操作

Python中,對日期和時間的操作,主要使用這3個內置模塊: datetime 、 time 和 calendar 獲取當前時間對應的數字 開發程序時,經常需要獲取兩個代碼位置在執行時的時間差,比如,我們想知道某個函數執行大概耗費了多少時間,就可以使用time.time()來做。 import time before =…

Java BigDecimal restder()方法與示例

BigDecimal類的restder()方法 (BigDecimal Class remainder() method) Syntax: 句法: public BigDecimal remainder(BigDecimal divsr);public BigDecimal remainder(BigDecimal divsr, MathContext ma_co);remainder() method is available in java.math package.…

python程序需要編譯么_python需要編譯么

一個經常聽見的問題,那就是:Python是解釋型的語言嗎?它會被編譯嗎?這個問題沒有想象中那么好回答。和很多人認識世界一樣,習慣以一個簡單的模型去評判一些事物。而事實上,里面包含了很多很多的細節。通常的…

DevOps平臺中的自動化部署框架設計

本文目錄: 一、背景 二、我們的需求是什么? 三、概念澄清 四、概念模型 五、總體設計 六、關鍵點設計 七、總結 一、背景 說到自動化部署,大家肯定都會想到一些配置管理工具,像ansible,chef,puppet, saltstack等等。雖然這些工具給…

插入排序算法 ,遞歸實現_C程序實現遞歸插入排序

插入排序算法 ,遞歸實現The only difference between Insertion sort and Recursive Insertion Sort is that in the Recursive method, we start from placing the last element in its correct position in the sorted array instead of starting from the first. 插入排序和…