{"record":{"id":"1afbfe8d74391015","repo":"apache/seatunnel","slug":"unsupported-classloader","errorCode":null,"errorMessage":"Unsupported classloader: ","messagePattern":"Unsupported classloader: ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"seatunnel-core/seatunnel-core-starter/src/main/java/org/apache/seatunnel/core/starter/utils/ConfigValidationUtils.java","lineNumber":101,"sourceCode":"    private static final BiConsumer<ClassLoader, List<URL>> ADD_URL_TO_CLASSLOADER =\n            (classLoader, urls) -> {\n                if (classLoader instanceof URLClassLoader) {\n                    urls.forEach(url -> ReflectionUtils.invoke(classLoader, \"addURL\", url));\n                } else {\n                    try {\n                        Optional<Method> method =\n                                ReflectionUtils.getDeclaredMethod(\n                                        URLClassLoader.class, \"addURL\", URL.class);\n                        if (!method.isPresent()) {\n                            throw new IllegalStateException(\n                                    \"Unable to find addURL method from URLClassLoader\");\n                        }\n                        method.get().setAccessible(true);\n                        for (URL url : urls) {\n                            method.get().invoke(classLoader, url);\n                        }\n                    } catch (Exception e) {\n                        throw new RuntimeException(\n                                \"Unsupported classloader: \" + classLoader.getClass().getName(), e);\n                    }\n                }\n            };\n\n    private ConfigValidationUtils() {}\n\n    public static void validate(Config config) {\n        validate(config, CheckResult.success());\n    }\n\n    public static void validate(Config config, CheckResult checkResult) {\n        if (!checkResult.isSuccess()) {\n            throw new ConfigCheckException(checkResult.getMsg());\n        }\n\n        ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();\n        ClassLoader validationClassLoader = prepareClassLoader(config, parentClassLoader);","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-core/seatunnel-core-starter/src/main/java/org/apache/seatunnel/core/starter/utils/ConfigValidationUtils.java#L83-L119","documentation":"ConfigValidationUtils installs an ADD_URL_TO_CLASSLOADER consumer that reflectively calls URLClassLoader.addURL to inject plugin jars. If the classloader is not a URLClassLoader (or the reflective add fails), it wraps the failure in RuntimeException('Unsupported classloader: <className>').","triggerScenarios":"Plugin discovery runs with a classloader that is not a URLClassLoader, e.g. when running inside a container/agent that supplies a custom (AppCDS, Spring Boot LaunchedURLClassLoader variants, module) classloader.","commonSituations":"Embedding SeaTunnel validation in another application server, unusual -Djava.system.class.loader settings, or running under tooling that replaces the context classloader.","solutions":["Ensure validation runs with a URLClassLoader as the context classloader","Wrap the target classloader in a new URLClassLoader(urls, parent) before validation","Check the exception cause; if the reflective addURL itself failed, align JDK version/permissions"],"exampleFix":"// before\nClassLoader cl = Thread.currentThread().getContextClassLoader(); // custom loader\n// after\nClassLoader parent = Thread.currentThread().getContextClassLoader();\nURLClassLoader cl = new URLClassLoader(urls, parent); // ensure URLClassLoader is used","handlingStrategy":"try-catch","validationCode":"if (!(Thread.currentThread().getContextClassLoader() instanceof URLClassLoader)) { /* wrap in new URLClassLoader(urls, parent) */ }","typeGuard":"boolean isUrlClassLoader(ClassLoader cl) { return cl instanceof URLClassLoader; }","tryCatchPattern":"try { ConfigValidationUtils.validate(config); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"Unsupported classloader\")) { /* re-run with URLClassLoader */ } }","preventionTips":["Run validation with a plain URLClassLoader as context classloader","Avoid embedding validation under application servers with custom loaders","Wrap external classloaders before plugin discovery"],"tags":["classloader","plugins","reflection"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}