pf4j 例子应用 类加载机制验证
所属分类 pf4j
浏览量 658
pf4j 官方例子里
应用依赖了 apache commons-lang 包
plugin1 里 也 依赖 apache commons-lang 包 ,插件打包时会把依赖的jar包一并打进去
pf4j-release-3.4.0/demo-dist/plugins
jar tvf pf4j-demo-plugin1-3.4.0-all.jar|grep StringUtils
org/apache/commons/lang/RandomStringUtils.class
org/apache/commons/lang/StringUtils.class
使用 arthas 查看 类加载器及 类加载信息
pf4j-release-3.4.0/demo/app/src/main/java/org/pf4j/demo/Boot.java
修改下代码
pluginManager.stopPlugins(); 前增加
Thread.sleep(1000 * 1000L);
这样方便 arthas 连接上去 查看
java -jar pf4j-demo.jar
使用 jdk11 启动时 , arthas 连接失败
设置 JAVA_HOEM ,使用 jdk11 启动 arthas 后连接成功
查看classloader 信息
classloader -l
name loadedCount hash parent
BootstrapClassLoader 1946 null null
com.taobao.arthas.agent.ArthasClassloader@44e3b0fd 1109 44e3b0fd sun.misc.Launcher$ExtClassLoader
@448139f0
org.pf4j.PluginClassLoader@3d299e3 2 3d299e3 sun.misc.Launcher$AppClassLoader
@42a57993
org.pf4j.PluginClassLoader@1a84f40f 2 1a84f40f sun.misc.Launcher$AppClassLoader
@42a57993
sun.misc.Launcher$AppClassLoader@42a57993 775 42a57993 sun.misc.Launcher$ExtClassLoader
@448139f0
sun.misc.Launcher$ExtClassLoader@448139f0 23 448139f0 null
发现有两个 org.pf4j.PluginClassLoader
因为有两个插件 ,每一个插件都用 独立的 ClassLoader 加载
插件 类加载器的 父加载器是 sun.misc.Launcher$AppClassLoader@42a57993
查看 org.apache.commons.lang.StringUtils 的 类加载信息
sc -d org.apache.commons.lang.StringUtils
class-info org.apache.commons.lang.StringUtils
code-source /PATH/pf4j-release-3.4.0/demo-dist/lib/commons-lang-2.4.jar
name org.apache.commons.lang.StringUtils
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name StringUtils
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@42a57993
+-sun.misc.Launcher$ExtClassLoader@448139f0
classLoaderHash 42a57993
Affect(row-cnt:1) cost in 5 ms.
org.apache.commons.lang.StringUtils 只被加载了一次
只有 lib 下 StringUtils 被加载了 ,这个是 由 应用加载器 加载的
sun.misc.Launcher$AppClassLoader@42a57993
符合 双亲委托加载模式
这样的话 plugin1 把 apache commons-lang 包 打进去没有意义
跟父类冲突的话 ,使用插件也解决不了
pf4j简介及例子运行说明
上一篇
下一篇
scala Option 小结
jdbc获取自增主键ID
pf4j简介及例子运行说明
Play2.6.x开始使用Akka HTTP作为默认服务后端
guice循环依赖处理
guice根据名字注入消除歧义