首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的应用程序找不到Pf4j的扩展

我的应用程序找不到Pf4j的扩展
EN

Stack Overflow用户
提问于 2022-09-08 19:25:10
回答 1查看 57关注 0票数 0

我正在使用Spring应用程序。目前,插件的使用非常简单。我只是在听教程。我的插件启动了,我试图找到如下的扩展:

代码语言:javascript
复制
final List<MyExtensionPoint> sections = pluginManager.getExtensions(MyExtensionPoint.class);

但是Pf4j不返回扩展。

当我跟踪代码执行时,我可以在AbstractExtensionFinder中看到以下代码:

代码语言:javascript
复制
if (type.isAssignableFrom(extensionClass)) {
  ExtensionWrapper extensionWrapper = createExtensionWrapper(extensionClass);
  result.add(extensionWrapper);
  log.debug("Added extension '{}' with ordinal {}", className, extensionWrapper.getOrdinal());
} else {
  log.trace("'{}' is not an extension for extension point '{}'", className, type.getName());
  if (RuntimeMode.DEVELOPMENT.equals(pluginManager.getRuntimeMode())) {
    checkDifferentClassLoaders(type, extensionClass);
  }
}

我可以理解程序没有进入这个条件,因为我有两个不同的类加载器: PluginClassLoader (用于扩展)和RestartClassLoader (来自Spring,用于扩展点的接口)。

我不明白为什么会出现问题,因为我认为要实例化扩展类,PluginClassloader将使用父类加载器(RestartClassLoader)查找接口。

我的错误在哪里?怎么修呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-10 19:55:18

我扩展了DevelopmentPluginLoader以传递Spring类加载器。

代码语言:javascript
复制
public class MyDevelopmentPluginLoader extends DevelopmentPluginLoader {

    private ClassLoader parentClassLoader;

    /**
     * @param pluginManager
     */
    public MyDevelopmentPluginLoader(final PluginManager pluginManager, final ClassLoader parentClassLoader) {
        super(pluginManager);
        this.parentClassLoader = parentClassLoader;
    }

    @Override
    protected PluginClassLoader createPluginClassLoader(final Path pluginPath, final PluginDescriptor pluginDescriptor) {
        return new PluginClassLoader(pluginManager, pluginDescriptor, parentClassLoader);
    }
}

在我的自定义PluginManager中,我创建了PluginLoader的实例和实例:

代码语言:javascript
复制
protected PluginLoader createPluginLoader() {

        final CompoundPluginLoader compoundPluginLoader = new CompoundPluginLoader();
        final PluginLoader developmentPluginLoader = new MyDevelopmentPluginLoader(this, getClass().getClassLoader());
        final PluginLoader jarPluginLoader = new JarPluginLoader(this);
        final PluginLoader defaultPluginLoader = new DefaultPluginLoader(this);

        // @formatter:off
        return compoundPluginLoader.
                add(developmentPluginLoader, this::isDevelopment).
                add(jarPluginLoader, this::isNotDevelopment).
                add(defaultPluginLoader, this::isNotDevelopment);
        // @formatter:on
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73654174

复制
相关文章

相似问题

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