Java 为什么pluginManager.getExtensions的结果为空?
在尝试使用PF4J时,我创建了中概述的必要零件Java 为什么pluginManager.getExtensions的结果为空?,java,pf4j,Java,Pf4j,在尝试使用PF4J时,我创建了中概述的必要零件 扩展扩展点的接口 插件 装有舱单的罐子 插件加载和激活 为什么ClickHandler列表为空? 我已经通过JUnit测试对此进行了测试,在那里我可以调试其他似乎工作正常的部分。请参阅下面的调试日志 我还研究并激活了Eclipse注释处理,但没有产生任何积极影响 1。扩展扩展点的接口 unzip -q -c target/com.bitplan.mb-0.0.1.jar META-INF/MANIFEST.MF Manifest-Version:
unzip -q -c target/com.bitplan.mb-0.0.1.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Plugin-Dependencies:
Plugin-Id: com.bitplan.mb
Built-By: wf
Plugin-Provider: BITPlan GmbH
Plugin-Version: 0.0.1
Plugin-Class: com.bitplan.mb.MBClickHandlerPlugin
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_152
公共界面ClickHandler扩展扩展扩展点{
...
}
2。插件
public类MBClickHandlerPlugin扩展插件{
/**
*构造我
*@param包装器
*/
公共MBClickHandlerPlugin(插件包装器){
超级包装机;
}
@延伸
公共静态类MBClickHandler实现ClickHandler{
}
}
3。带有清单的Jar
unzip -q -c target/com.bitplan.mb-0.0.1.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Plugin-Dependencies:
Plugin-Id: com.bitplan.mb
Built-By: wf
Plugin-Provider: BITPlan GmbH
Plugin-Version: 0.0.1
Plugin-Class: com.bitplan.mb.MBClickHandlerPlugin
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_152
4。插件加载和激活
/**
*激活命令行上请求的插件
*/
公共void activatePlugins(){
pluginManager=newdefaultpluginmanager();
for(字符串插件:插件){
路径pluginPath=Path.get(plugin);
pluginManager.loadPlugin(pluginPath);
}
pluginManager.startPlugins();
列表clickHandlers=pluginManager
.getExtensions(ClickHandler.class);
对于(ClickHandler ClickHandler:ClickHandler){
安装clickHandler(clickHandler);
}
}
调试日志
22 [main] DEBUG org.pf4j.CompoundPluginDescriptorFinder - Try to continue with the next finder
22 [main] DEBUG org.pf4j.CompoundPluginDescriptorFinder - 'org.pf4j.ManifestPluginDescriptorFinder@73d4cc9e' is applicable for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
24 [main] DEBUG org.pf4j.AbstractPluginManager - Found descriptor PluginDescriptor [pluginId=com.bitplan.mb, pluginClass=com.bitplan.mb.MBClickHandlerPlugin, version=0.0.1, provider=BITPlan GmbH, dependencies=[], description=, requires=*, license=null]
24 [main] DEBUG org.pf4j.AbstractPluginManager - Class 'com.bitplan.mb.MBClickHandlerPlugin' for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
24 [main] DEBUG org.pf4j.AbstractPluginManager - Loading plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
24 [main] DEBUG org.pf4j.CompoundPluginLoader - 'org.pf4j.DefaultPluginLoader@6366ebe0' is not applicable for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
24 [main] DEBUG org.pf4j.CompoundPluginLoader - 'org.pf4j.JarPluginLoader@44f75083' is applicable for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
25 [main] DEBUG org.pf4j.PluginClassLoader - Add 'file:/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
25 [main] DEBUG org.pf4j.AbstractPluginManager - Loaded plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar' with class loader 'org.pf4j.PluginClassLoader@43d7741f'
25 [main] DEBUG org.pf4j.AbstractPluginManager - Creating wrapper for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
25 [main] DEBUG org.pf4j.AbstractPluginManager - Created wrapper 'PluginWrapper [descriptor=PluginDescriptor [pluginId=com.bitplan.mb, pluginClass=com.bitplan.mb.MBClickHandlerPlugin, version=0.0.1, provider=BITPlan GmbH, dependencies=[], description=, requires=*, license=null], pluginPath=/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar]' for plugin '/Users/wf/Documents/workspace/com.bitplan.mb/target/com.bitplan.mb-0.0.1.jar'
26 [main] DEBUG org.pf4j.DependencyResolver - Graph:
com.bitplan.mb -> []
26 [main] DEBUG org.pf4j.DependencyResolver - Plugins order: [com.bitplan.mb]
27 [main] INFO org.pf4j.AbstractPluginManager - Plugin 'com.bitplan.mb@0.0.1' resolved
27 [main] INFO org.pf4j.AbstractPluginManager - Start plugin 'com.bitplan.mb@0.0.1'
27 [main] DEBUG org.pf4j.DefaultPluginFactory - Create instance for plugin 'com.bitplan.mb.MBClickHandlerPlugin'
28 [main] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'com.bitplan.uml2mxgraph.ClickHandler'
28 [main] DEBUG org.pf4j.LegacyExtensionFinder - Reading extensions storages from classpath
28 [main] DEBUG org.pf4j.AbstractExtensionFinder - No extensions found
28 [main] DEBUG org.pf4j.LegacyExtensionFinder - Reading extensions storages from plugins
28 [main] DEBUG org.pf4j.LegacyExtensionFinder - Reading extensions storage from plugin 'com.bitplan.mb'
28 [main] DEBUG org.pf4j.LegacyExtensionFinder - Cannot find 'META-INF/extensions.idx'
28 [main] DEBUG org.pf4j.AbstractExtensionFinder - No extensions found
28 [main] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'com.bitplan.uml2mxgraph.ClickHandler' for plugin 'null'
28 [main] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'com.bitplan.uml2mxgraph.ClickHandler' for plugin 'com.bitplan.mb'
29 [main] DEBUG org.pf4j.AbstractExtensionFinder - Found 0 extensions for extension point 'com.bitplan.uml2mxgraph.ClickHandler
“解决方案1
使用定制的PluginManager
pluginManager = new JarPluginManager(this.getClass().getClassLoader());
从将使用插件以确保使用相同类加载器的类
JarPluginManager源代码:
解决办法#2
如果未创建extensions.idx文件,则说明批注处理有问题。您可能希望修复问题的根源,但也可以尝试解决它:
- 指给我手动创建META-INF/extensions.idx文件,并确保静态内部类没有args构造函数有了这些变化,一切都会顺利进行。
- 注意在extensions.idx中正确设置类名 文件-否则,处理程序列表中的条目将为空
- 注意使用空参数构造函数,否则将以异常结束
@扩展名
公共静态类MBClickHandler实现ClickHandler{
/**
*无参数构造函数
*/
公共MBClickHandler(){
}
src/main/resources/META-INF/extensions.idx
com.bitplan.mb.MBClickHandlerPlugin$MBClickHandler
要检查的代码
MBClickHandler ch=new MBClickHandler();
File extFile=new文件(“src/main/resources/META-INF/extensions.idx”);
字符串extidx=FileUtils.readFileToString(extFile,“UTF-8”);
assertEquals(extidx,ch.getClass().getName());
List startedPlugins=pluginManager.getStartedPlugins();
for(PluginWrapper插件:startedPlugins){
字符串pluginId=plugin.getDescriptor().getPluginId();
System.out.println(String.format(“插件'%s':”,pluginId添加的扩展”);
设置extensionClassNames=pluginManager.getExtensionClassNames(pluginId);
for(字符串扩展名:extensionClassNames){
System.out.println(“+”扩展名);
}
}
另请参见问题