- 在 solo 的
solo\src\main\webapp\plugins
目录下应该是存放插件的地方,这里有三个文件夹(git clone 时就有的),里面的插件似乎都不完整,每次启动 solo 都会因为找不到插件对应的 classes 目录而报错。虽然不影响 solo 的启动,但是看到这一连串的报错总是觉得不完美。 - solo 前台的模板如果想自己开发,扩展应该也提供相关的文档说明供用户使用,或者有详细文档我没找到,如有知情者请告之。谢谢。
solo 的插件开发,模板开发哪里有文档说明?(顺便修复 JDK11 以上插件加载会报错的问题)
相关帖子
-
yanxingangsun •作者
我切换成 JDK8 的平台重新编译执行还是会报错:(下面是我加的打印)
pluginDirPaths: [/plugins/kanbanniang/, /plugins/list/, /plugins/symphony-interest/] [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/kanbanniang/classes 目录不存在,插件加载失败! [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/list/classes 目录不存在,插件加载失败! [ERROR]-[2019-06-27 09:38:33]-[org.b3log.latke.plugin.PluginManager:180]: defaultClassesFileDirURL : /plugins/symphony-interest/classes 目录不存在,插件加载失败!
看了一下,这个问题涉及到 latke 的 latke-core 模块,在 latke-core 模块的 org.b3log.latke.plugin.PluginManager 代码中会查找/plugins 目录下的插件对应的 classes 目录:
"/plugins/" + plugin + "/classes"
,如果没有找到这个目录就会抛出异常。跟 JDK 版本没有关系。下面是 solo 的 plugins 目录下的文件结构,你看看跟我的一样吗?(而且都没有 classes 目录)
tree.zip在
solo\src\main\java\org\b3log\solo\plugin
目录下也没有那三个插件对应的 java 源码文件。D:\solo\src\main\java\org\b3log\solo\plugin>tree /f 卷 工作 的文件夹 PATH 列表 卷序列号为 0006-4F18 D:. │ package-info.java │ └─list ListHandler.java
3 操作yanxingangsun 在 2019-06-27 10:07:13 更新了该回帖yanxingangsun 在 2019-06-27 10:06:36 更新了该回帖yanxingangsun 在 2019-06-27 10:03:20 更新了该回帖 - 其他回帖
-
yanxingangsun • • 1作者
没错就是这里说的这个问题,JDK11 以上插件加载会报错。看了 github 上处理问题的对话,最后要求降版本到 java1.8 来解决,但是原因可能没有找到,这样会影响整个项目的升级。
这个问题的原因隐藏得较深,问题不是出在 solo 上,而是出在 latke-core 的 org.b3log.latke.plugin.PluginManager 的代码上,问题代码如下:final URLClassLoader classLoader = new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader());
首先
defaultClassesFileDirURL
这个变量一般情况下值为null
,在defaultClassesFileDirURL==null
的情况下,new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader());
- 在 java1.8 版本情况下运行不会抛出异常;
- 在 java11 以后版本情况下运行会抛出异常;
在抛出异常后插件加载失败。
把上面代码改成如下形式,问题即可解决:
URLClassLoader classLoader=null; if(defaultClassesFileDirURL==null){ classLoader = new URLClassLoader(new URL[]{ classesFileDirURL}, PluginManager.class.getClassLoader()); } else{ classLoader = new URLClassLoader(new URL[]{ defaultClassesFileDirURL, classesFileDirURL}, PluginManager.class.getClassLoader()); }
这个老大难问题解决了,项目版本可以顺利升级了,希望站长能多给些奖励哈。 今天有点晚了,明天我去 github 上提个 PR 吧,早点关闭掉。
1 回复3 操作yanxingangsun 在 2019-06-28 00:09:37 更新了该回帖yanxingangsun 在 2019-06-28 00:08:25 更新了该回帖yanxingangsun 在 2019-06-28 00:06:42 更新了该回帖 - 查看全部回帖
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于