我写的 dubbo 扩展 jar 包如何无侵入的给别人使用

有这么一个场景, 我写了一个 dubbo spi 扩展 jar 包 dubbo-ext.jar
; 这个 Jar 包是不可执行包(没有 main 函数), 它的作用是对现有运行的 dubbo 服务做一些增强;那么这样的一个扩展包,要符合即插即用的原则;要无侵入的增强;
正常情况下我们可能直接在 pom 文件依赖一下这个包;因为无侵入原则,那么这条路就不能走了; 那可怎么办呢?
Tomcat 启动方式
如果目标服务是用 Tomcat 启动的,那么很简单,我们可以直接把我们的扩展 jar 包dubbo-ext.jar
扔进 lib 文件夹下面;Tomcat 会自动为我们加载这些 jar 包;
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/
中; 下面我们具体详细讲一下这个操作步骤
Part1jar 命令参数说明

看到上面的参数选项; 我们决定使用 -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!
参考文章

版权声明: 本文为 InfoQ 作者【石臻臻的杂货铺】的原创文章。
原文链接:【http://xie.infoq.cn/article/161eca1611f49a5d433c28f65】。未经作者许可,禁止转载。
评论