tale icon indicating copy to clipboard operation
tale copied to clipboard

Tale插件加载方式存在问题

Open Linindoo opened this issue 6 years ago • 6 comments

我现在写了一个插件,这个插件会依赖于某个第三方的jar包,在打包的时候我没有将这个第三方jar包打包进插件里,我希望保持插件的干净。然后我将依赖的第三方jar包放在lib路径下面,结果在加载插件的时候报错了:java.lang.NoClassDefFoundError

所以针对这种问题有什么好的解决方案?在加载插件的时候可不可以再去lib目录查找依赖jar呢?还是说必须把额外的依赖jar打包到插件中来?

抱大腿

Linindoo avatar Feb 15 '19 02:02 Linindoo

otale/plugin_qiniu@95191f1 你可以类似这样干

嗯,这个我知道,但是这样打包的话实在是太不优雅 我先要实现的效果是: 插件单独打成一个jar包,插件依赖的jar单独处理,将额外依赖的jar放在tale项目的lib目录下面,加载插件的时候也能将插件的依赖从lib目录中读取出来 但是我这样做之后,实际项目的运行情况是: tale运行的时候会加载lib下面的jar包,但是没有依赖的jar不会加载,当加载插件的时候,因为插件的依赖也是放在lib目录下面,但是这些jar没有加载进去,而插件的classloader也不会再去lib目录下面寻找依赖jar,只会读取plugin目录下面的jar

目前的解决方法是将插件依赖的jar一起放在plugin文件夹下面 但是这样做太丑了

所以tale有没有可能在内部解决这个问题?

Linindoo avatar Feb 20 '19 02:02 Linindoo

目前还没有,插件的目的是即插即用,如果装载插件还需要编译拉取插件所需的包是对本地项目的破坏,而且生产环境中没有mvn去拉取和管理依赖包

dongm2ez avatar Feb 21 '19 03:02 dongm2ez

目前还没有,插件的目的是即插即用,如果装载插件还需要编译拉取插件所需的包是对本地项目的破坏,而且生产环境中没有mvn去拉取和管理依赖包

我并不是说编译还要拉取插件所需要的包,我是说运行时加载插件的包

Linindoo avatar Feb 21 '19 05:02 Linindoo

好吧,是我的理解出现了偏差。

但是我还是不明白为什么要把他们分开,因为你的包依赖的第三方包从模块来说也许只是和你的插件有关系,应该和插件是一个整体而且是不可分割的一部分,缺少它插件就无法运行。

那么把他们分开的原因是什么,而且这样还会增加安装和卸载难度。

dongm2ez avatar Feb 21 '19 06:02 dongm2ez

好吧,是我的理解出现了偏差。

但是我还是不明白为什么要把他们分开,因为你的包依赖的第三方包从模块来说也许只是和你的插件有关系,应该和插件是一个整体而且是不可分割的一部分,缺少它插件就无法运行。

那么把他们分开的原因是什么,而且这样还会增加安装和卸载难度。

应该是强迫症吧,我觉得这样项目结构看起来干净些,而且发布也更方便轻量

我曾经也试过你说的方法,但是这种方法有些问题 1:打包后,依赖的第三方jar的class会和插件里面的class混合到一起 2: jar-with-dependencies那难看的后缀名,暂时还不知道怎么自定义这个后缀

Linindoo avatar Feb 21 '19 06:02 Linindoo