Spring 5.2.x升级至5.3.x后Wildfly 20下Quartz插件Job类抛出ClassNotFoundException
根因
Spring 5.3.x 对 Quartz 集成模块中 ResourceLoaderClassLoadHelper 的类加载逻辑做了调整:5.2版本中该类会优先读取线程上下文类加载器加载类,5.3之后改为固定使用Spring上下文关联的类加载器(也就是你的WAR包对应的Wildfly模块类加载器),不会识别你自定义的PluginsClassLoader,所以插件JAR中的任务类加载失败。
修复方案
自定义Quartz类加载助手,让它优先使用你的插件类加载器加载类,操作如下:
- 实现自定义
ClassLoadHelper
public class PluginClassLoadHelper implements ClassLoadHelper { private final ClassLoader pluginsClassLoader; // 传入你自己的插件类加载器实例 public PluginClassLoadHelper(ClassLoader pluginsClassLoader) { this.pluginsClassLoader = pluginsClassLoader; } @Override public void initialize() { } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { return pluginsClassLoader.loadClass(name); } catch (ClassNotFoundException e) { // 兜底用应用默认类加载器加载WAR包内的类 return getClass().getClassLoader().loadClass(name); } } @Override public <T> Class<? extends T> loadClass(String name, Class<T> clazz) throws ClassNotFoundException { return (Class<? extends T>) loadClass(name); } @Override public URL getResource(String name) { URL res = pluginsClassLoader.getResource(name); return res != null ? res : getClass().getClassLoader().getResource(name); } @Override public InputStream getResourceAsStream(String name) { InputStream is = pluginsClassLoader.getResourceAsStream(name); return is != null ? is : getClass().getClassLoader().getResourceAsStream(name); } @Override public ClassLoader getClassLoader() { return pluginsClassLoader; } }
- 在
SchedulerFactoryBean配置中替换默认的类加载助手
@Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 原有配置(数据源、事务管理器、触发器等)保持不变 // 新增配置,替换默认类加载助手 bean.setClassLoadHelper(new PluginClassLoadHelper(你的PluginsClassLoader实例)); return bean; }
配置完成后重启应用即可,原有持久化的任务数据无需修改,可正常加载执行。
内容的提问来源于stack exchange,提问作者katanel
相关产品推荐
相关产品推荐

