首页  

pf4j 例子应用 类加载机制验证     所属分类 pf4j 浏览量 496
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根据名字注入消除歧义