我寫的擴展jar包如何無侵入的給別人使用

有這麼一個場景, 我寫了一個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中呢?

  1. 解壓XXX.jar包,然後把我們的擴展包dubbo-ext.jar 扔到 BOOT-INF/lib中;
    然後重新打包; 這種方式應該是也可以實現的; 但是卻比較繁瑣;這裏推薦第二種方式

  2. 使用命令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!

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章