mirror of https://github.com/halo-dev/halo
Set context ClassLoader to plugin ClassLoader for correct class loading operations (#7725)
#### What type of PR is this? /kind bug /area plugin /milestone 2.21.x #### What this PR does / why we need it: This PR fixes the problem that loading resources from class path during static initialization doesn't work. #### Does this PR introduce a user-facing change? ```release-note 修复部分场景下无法正常启动插件的问题 ```pull/7726/head
parent
a32cd4b551
commit
2a37366c92
|
@ -70,6 +70,12 @@ public class DefaultPluginApplicationContextFactory implements PluginApplication
|
||||||
var pluginWrapper = pluginManager.getPlugin(pluginId);
|
var pluginWrapper = pluginManager.getPlugin(pluginId);
|
||||||
var classLoader = pluginWrapper.getPluginClassLoader();
|
var classLoader = pluginWrapper.getPluginClassLoader();
|
||||||
|
|
||||||
|
// Set the context ClassLoader to the plugin ClassLoader to ensure that
|
||||||
|
// any class loading operations performed by the context (e.g., initializing
|
||||||
|
// bean definitions, loading class resources during static initialization)
|
||||||
|
// use the correct ClassLoader.
|
||||||
|
Thread.currentThread().setContextClassLoader(classLoader);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manually creating a BeanFactory and setting the plugin's ClassLoader is necessary
|
* Manually creating a BeanFactory and setting the plugin's ClassLoader is necessary
|
||||||
* to ensure that conditional annotations (e.g., @ConditionalOnClass) within the plugin
|
* to ensure that conditional annotations (e.g., @ConditionalOnClass) within the plugin
|
||||||
|
@ -182,6 +188,7 @@ public class DefaultPluginApplicationContextFactory implements PluginApplication
|
||||||
|
|
||||||
log.debug("Refreshing application context for plugin {}", pluginId);
|
log.debug("Refreshing application context for plugin {}", pluginId);
|
||||||
sw.start("Refresh");
|
sw.start("Refresh");
|
||||||
|
|
||||||
context.refresh();
|
context.refresh();
|
||||||
sw.stop();
|
sw.stop();
|
||||||
log.debug("Refreshed application context for plugin {}", pluginId);
|
log.debug("Refreshed application context for plugin {}", pluginId);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package run.halo.app.plugin;
|
package run.halo.app.plugin;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
@ -39,6 +40,8 @@ class DefaultPluginApplicationContextFactoryTest {
|
||||||
when(pluginManager.getPlugin("fake-plugin")).thenReturn(pw);
|
when(pluginManager.getPlugin("fake-plugin")).thenReturn(pw);
|
||||||
var context = factory.create("fake-plugin");
|
var context = factory.create("fake-plugin");
|
||||||
|
|
||||||
|
assertEquals(pw.getPluginClassLoader(), Thread.currentThread().getContextClassLoader());
|
||||||
|
|
||||||
assertInstanceOf(PluginApplicationContext.class, context);
|
assertInstanceOf(PluginApplicationContext.class, context);
|
||||||
assertNotNull(context.getBeanProvider(SearchService.class).getIfUnique());
|
assertNotNull(context.getBeanProvider(SearchService.class).getIfUnique());
|
||||||
assertNotNull(context.getBeanProvider(PluginsRootGetter.class).getIfUnique());
|
assertNotNull(context.getBeanProvider(PluginsRootGetter.class).getIfUnique());
|
||||||
|
|
Loading…
Reference in New Issue