首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pluginManager.getExtensions的结果是空的?

为什么pluginManager.getExtensions的结果是空的?
EN

Stack Overflow用户
提问于 2018-11-13 11:54:22
回答 1查看 989关注 0票数 0

在尝试使用PF4J时,我创建了必要的部分,如

https://github.com/pf4j/pf4j

  1. 扩展ExtensionPoint的接口
  2. 插件
  3. 有进度表的罐子
  4. 插件加载与激活

为什么clickHandlers列表是空的?

我已经用JUnit测试测试了这一点,在这里,我可以调试其他看起来工作正常的部分。请参阅下面的调试日志。

我还查看了https://github.com/pf4j/pf4j/issues/21,并激活了Eclipse批注处理,没有产生任何积极影响。

1.扩展扩展点的接口

代码语言:javascript
复制
public interface ClickHandler extends ExtensionPoint {
...

}

2.插件

代码语言:javascript
复制
public class MBClickHandlerPlugin extends Plugin {

  /**
   * construct me
   * @param wrapper
   */
  public MBClickHandlerPlugin(PluginWrapper wrapper) {
    super(wrapper);
  }

  @Extension
  public static class  MBClickHandler implements ClickHandler {


  }
}

3.jar与Manifest

代码语言:javascript
复制
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.插件加载和激活

代码语言:javascript
复制
  /**
   * activate the plugins requested on the command line
   */
  public void activatePlugins() {
    pluginManager = new DefaultPluginManager();

    for (String plugin : plugins) {
      Path pluginPath = Paths.get(plugin);
      pluginManager.loadPlugin(pluginPath);
    }
    pluginManager.startPlugins();

    List<ClickHandler> clickHandlers = pluginManager
        .getExtensions(ClickHandler.class);
    for (ClickHandler clickHandler : clickHandlers) {
      installClickHandler(clickHandler);
    }
  }

调试日志

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 12:53:07

解决方案#1

使用自定义的PluginManager

代码语言:javascript
复制
pluginManager = new JarPluginManager(this.getClass().getClassLoader());

将使用插件的类确保使用相同的类加载器。

JarPluginManager源代码:

代码语言:javascript
复制
import java.nio.file.Path;

import org.pf4j.DefaultPluginManager;
import org.pf4j.JarPluginLoader;
import org.pf4j.ManifestPluginDescriptorFinder;
import org.pf4j.PluginClassLoader;
import org.pf4j.PluginDescriptor;
import org.pf4j.PluginDescriptorFinder;
import org.pf4j.PluginLoader;
import org.pf4j.PluginManager;

/**
 * see https://github.com/pf4j/pf4j/issues/249 see
 * https://pf4j.org/doc/class-loading.html
 * 
 * @author wf
 *
 */
public class JarPluginManager extends DefaultPluginManager {
  public static class ParentClassLoaderJarPluginLoader extends JarPluginLoader {
    static ClassLoader parentClassLoader;

    /**
     * 
     * @param pluginManager
     */
    public ParentClassLoaderJarPluginLoader(PluginManager pluginManager) {
      super(pluginManager);
    }

    static PluginClassLoader pluginClassLoader;

    @Override
    public ClassLoader loadPlugin(Path pluginPath,
        PluginDescriptor pluginDescriptor) {
      if (pluginClassLoader == null) {
        boolean parentFirst=true;
        pluginClassLoader = new PluginClassLoader(pluginManager,
            pluginDescriptor, parentClassLoader,parentFirst);
      }
      pluginClassLoader.addFile(pluginPath.toFile());

      return pluginClassLoader;
    }
  }

  /**
   * construct me with the given classloader
   * @param classLoader
   */
  public JarPluginManager(ClassLoader classLoader) {
    ParentClassLoaderJarPluginLoader.parentClassLoader=classLoader;
    //System.setProperty("pf4j.mode", RuntimeMode.DEPLOYMENT.toString());
    //System.setProperty("pf4j.mode", RuntimeMode.DEVELOPMENT.toString());
  }

  @Override
  protected PluginLoader createPluginLoader() {
    // load only jar plugins
    return new ParentClassLoaderJarPluginLoader(this);
  }

  @Override
  protected PluginDescriptorFinder createPluginDescriptorFinder() {
    // read plugin descriptor from jar's manifest
    return new ManifestPluginDescriptorFinder();
  }

}

解决方案2如果没有创建extensions.idx文件,那么您的注释处理就有问题了。您可能希望修复问题的根源,但也可以尝试解决这个问题:

  • https://groups.google.com/forum/#!topic/pf4j/nn20axJHpfI指示我手动创建META/扩展名.INF文件,并确保静态内部类没有args构造函数。通过这种改变可以工作.
  • 注意在extensions.idx文件中正确设置类名,否则将在处理程序列表中得到一个空项。
  • 注意使用空参数构造函数,否则会出现异常
代码语言:javascript
复制
@Extension
public static class  MBClickHandler implements ClickHandler {
  /**
   * constructor with no argument
   */
  public MBClickHandler() {

  }

src/main/resources/META-INF/extensions.idx

代码语言:javascript
复制
com.bitplan.mb.MBClickHandlerPlugin$MBClickHandler

代码检查

  1. extension.idx条目的正确名称
代码语言:javascript
复制
MBClickHandler ch=new MBClickHandler();
File extFile=new File("src/main/resources/META-INF/extensions.idx");
String extidx=FileUtils.readFileToString(extFile,"UTF-8");
assertEquals(extidx,ch.getClass().getName());
  1. 检查扩展
代码语言:javascript
复制
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins();

    for (PluginWrapper plugin : startedPlugins) {
       String pluginId = plugin.getDescriptor().getPluginId();
       System.out.println(String.format("Extensions added by plugin '%s':", pluginId));
       Set<String> extensionClassNames = pluginManager.getExtensionClassNames(pluginId);
       for (String extension : extensionClassNames) {
           System.out.println("   " + extension);
       }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53280499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档