You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类加载助手,让它优先使用你的插件类加载器加载类,操作如下:

  1. 实现自定义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;
    }
}
  1. 在SchedulerFactoryBean配置中替换默认的类加载助手
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean bean = new SchedulerFactoryBean();
    // 原有配置(数据源、事务管理器、触发器等)保持不变
    // 新增配置,替换默认类加载助手
    bean.setClassLoadHelper(new PluginClassLoadHelper(你的PluginsClassLoader实例));
    return bean;
}

配置完成后重启应用即可,原有持久化的任务数据无需修改,可正常加载执行。

内容的提问来源于stack exchange,提问作者katanel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:45:03