我正在使用Spring应用程序。目前,插件的使用非常简单。我只是在听教程。我的插件启动了,我试图找到如下的扩展:
final List<MyExtensionPoint> sections = pluginManager.getExtensions(MyExtensionPoint.class);但是Pf4j不返回扩展。
当我跟踪代码执行时,我可以在AbstractExtensionFinder中看到以下代码:
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)查找接口。
我的错误在哪里?怎么修呢?
谢谢。
发布于 2022-09-10 19:55:18
我扩展了DevelopmentPluginLoader以传递Spring类加载器。
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的实例和实例:
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
}https://stackoverflow.com/questions/73654174
复制相似问题