为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2022-01-19 09:44:28
尝试使用 PF4J 时,我创建了必要的部分,如https://github.com/pf4j/pf4j扩展 ExtensionPoint 的接口一个插件带有清单的罐子插件加载和激活为什么 clickHandlers 列表是空的?我已经使用 JUnit 测试对此进行了测试,我可以在其中调试似乎工作正常的其他部分。请参阅下面的调试日志。我还查看了https://github.com/pf4j/pf4j/issues/21并激活了 Eclipse 注释处理,但没有任何积极影响。1.扩展扩展点的接口public interface ClickHandler extends ExtensionPoint {...}2.一个插件public class MBClickHandlerPlugin extends Plugin {  /**   * construct me   * @param wrapper   */  public MBClickHandlerPlugin(PluginWrapper wrapper) {    super(wrapper);  }  @Extension  public static class  MBClickHandler implements ClickHandler {  }}3. 带有清单的罐子unzip -q -c target/com.bitplan.mb-0.0.1.jar META-INF/MANIFEST.MFManifest-Version: 1.0Plugin-Dependencies: Plugin-Id: com.bitplan.mbBuilt-By: wfPlugin-Provider: BITPlan GmbHPlugin-Version: 0.0.1Plugin-Class: com.bitplan.mb.MBClickHandlerPluginCreated-By: Apache Maven 3.5.2Build-Jdk: 1.8.0_1524.插件加载和激活  /**   * 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);    }  }
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

解决方法 #1


使用定制的 PluginManager


pluginManager = new JarPluginManager(this.getClass().getClassLoader());

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


JarPluginManager 源代码:


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/extensions.idx 文件并确保静态内部类没有 args 构造函数。有了这个改变,事情就开始了。


注意在 extensions.idx 文件中正确设置类名 - 否则您将在处理程序列表中得到一个空条目


注意有一个空参数构造函数,否则你会得到一个异常


@Extension

public static class  MBClickHandler implements ClickHandler {

  /**

   * constructor with no argument

   */

  public MBClickHandler() {


  }

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


com.bitplan.mb.MBClickHandlerPlugin$MBClickHandler

要检查的代码


extension.idx 条目的正确名称

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());

检查扩展

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);

       }

    }


查看完整回答
反对 回复 2022-01-19
  • 1 回答
  • 0 关注
  • 437 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信