有這麼一個場景, 我寫了一個dubbo spi擴展jar包 dubbo-ext.jar
; 這個Jar包是不可執行包(沒有main函數), 它的作用是對現有運行的dubbo服務做一些增強;
那麼這樣的一個擴展包,要符合即插即用的原則;要無侵入的增強;
正常情況下我們可能直接在pom文件依賴一下這個包;因爲無侵入原則,那麼這條路就不能走了; 那可怎麼辦呢?
1.Tomcat啓動方式
如果目標服務是用Tomcat啓動的,那麼很簡單,我們可以直接把我們的擴展jar包dubbo-ext.jar
扔進lib文件夾下面;Tomcat會自動爲我們加載這些jar包;
2. java -jar 啓動方式
我們現在大部分的項目都會選擇SpringBoot框架; 最常用的打包方式是打成 jar
包;然後使用javar -jar XXX.jar
的啓動方式; 但是這樣的話, jar包已經打好了, 我們怎麼把我們的擴展包dubbo-ext.jar
放入到 XXX.jar
中呢?
-
解壓
XXX.jar
包,然後把我們的擴展包dubbo-ext.jar
扔到BOOT-INF/lib
中;
然後重新打包; 這種方式應該是也可以實現的; 但是卻比較繁瑣;這裏推薦第二種方式 -
使用命令
jar -uf0 XXX.jar BOOT-INF/lib/
直接將我們的擴展包dubbo-ext.jar
直接放到XXX.jar
中的BOOT-INF/lib/
中; 下面我們具體詳細講一下這個操作步驟
jar 命令參數說明
看到上面的參數選項; 我們決定使用 -uf0
來操作;
- u: 更新現有的檔案
- f: 指定檔案文件名
- 0:僅存儲;不適用任何ZIP壓縮
操作流程
圖中features-common.jar
是我們的擴展包;
features-services-0.0.1-SNAPSHOT.jar
我們的可執行包;
我們要把features-common.jar
包放到 features-services-0.0.1-SNAPSHOT
中;
-
我們可以先解壓看看
features-services-0.0.1-SNAPSHOT
裏面是什麼樣的
jar -xf features-services-0.0.1-SNAPSHOT
;
解壓出來是下面的; 所有的依賴jar都在BOOT-INF/lib
中;
那麼這個BOOT-INF/lib
就是我們的目標路徑;
Ok,知道了路徑,我們把剛剛解壓之後的文件全部刪除掉;(只是解壓出來看看路徑而已) -
在當前路徑創建目標文件路徑
mkdir -p BOOT-INF/lib
; -
然後把擴展包
features-common.jar
放到這個路徑下,如下圖
這裏很重要,路徑一定要對! -
執行命令
jar -uf0 features-service-0.0.1-SNAPSHOT.jar BOOT-INF/lib/
執行這條命令的路徑一定要對;就在BOOT-INF
文件夾同級別
-
加載完成!
執行完畢之後 ,我們可以校驗一下是否放入到了 features-services-0.0.1-SNAPSHOT.jar
; 所以我們解壓一下剛剛更新過的 features-services-0.0.1-SNAPSHOT.jar
;
``
可以看到我們剛剛的擴展jar包 features-common.jar
已經加載到了 jar包中;
jar -uf0 features-service-0.0.1-SNAPSHOT.jar BOOT-INF/lib/
最容易出錯的地方就是後面的文件夾路徑了; 這個可不是你隨便寫的;
你這個路徑必須跟features-service-0.0.1-SNAPSHOT.jar
解壓之後存放依賴jar的路徑保持一致的!不然就算加載成功了,路徑不對,也使用不了 !
如果目標文件是一個war包呢
同理~; war包解壓看看;
把路徑改成 WEB-INF/lib
就行了!!
如果是一個zip包呢?
原理都是一樣的,可以先解壓看看jar的路徑;
親測ok!