{"record":{"id":"8f3cf2136b43e924","repo":"pinpoint-apm/pinpoint","slug":"failed-to-load-plugin-class-with-classloader-8f3cf2","errorCode":null,"errorMessage":"Failed to load plugin class {} with classLoader {}","messagePattern":"Failed to load plugin class (.+?) with classLoader (.+?)","errorType":"console","errorClass":"PinpointException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/PluginClassInjector.java","lineNumber":79,"sourceCode":"    }\n\n    @Override\n    public <T> Class<? extends T> injectClass(ClassLoader classLoader, String className) {\n        try {\n            if (bootstrapCore.isBootstrapPackage(className)) {\n                return bootstrapCore.loadClass(className);\n            }\n\n            if (bootstrapClassLoader == classLoader) {\n                return bootstrapClassLoaderHandler.injectClass(null, className);\n            } else if (classLoader instanceof URLClassLoader) {\n                return urlClassLoaderHandler.injectClass(classLoader, className);\n            } else {\n                return plainClassLoaderHandler.injectClass(classLoader, className);\n            }\n        } catch (Throwable e) {\n            // fixed for LinkageError\n            logger.warn(\"Failed to load plugin class {} with classLoader {}\", className, classLoader, e);\n            throw new PinpointException(\"Failed to load plugin class \" + className + \" with classLoader \" + classLoader, e);\n        }\n    }\n\n    @Override\n    public InputStream getResourceAsStream(ClassLoader targetClassLoader, String internalName) {\n        try {\n            if (bootstrapCore.isBootstrapPackageByInternalName(internalName)) {\n                return bootstrapCore.openStream(internalName);\n            }\n            if (targetClassLoader == null) {\n                return bootstrapClassLoaderHandler.getResourceAsStream(null, internalName);\n            } else if (targetClassLoader instanceof URLClassLoader) {\n                final URLClassLoader urlClassLoader = (URLClassLoader) targetClassLoader;\n                return urlClassLoaderHandler.getResourceAsStream(urlClassLoader, internalName);\n            } else {\n                return plainClassLoaderHandler.getResourceAsStream(targetClassLoader, internalName);\n            }","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/PluginClassInjector.java#L61-L97","documentation":"PluginClassInjector.injectClass is the top-level plugin class loading entry point: it routes to URLClassLoaderHandler or PlainClassLoaderHandler and wraps any Throwable (including LinkageError, hence the explicit catch of Throwable) in a PinpointException. This log means plugin class injection failed at some layer and instrumentation for that class cannot proceed.","triggerScenarios":"Any Throwable from urlClassLoaderHandler.injectClass or plainClassLoaderHandler.injectClass — ClassNotFound, LinkageError/duplicate definition, ClassCastException from bad routing, or errors inside define0.","commonSituations":"Corrupt or duplicate plugin jars; plugin class depending on classes absent from the target classloader; agent applied to exotic classloaders (non-URL, non-plain paths); container classloader isolation (OSGi, modular apps).","solutions":["Inspect the cause chain of the PinpointException to identify the failing handler and root error.","Remove duplicate/corrupt plugin jars from the plugin directory.","Ensure the plugin class and its dependencies are visible to the target classloader (or bootstrap path if bootstrap-routed).","For LinkageError, check for the same class being defined twice (concurrent transform) or conflicting plugin versions."],"exampleFix":"// before\nClass<?> c = injector.injectClass(classLoader, className); // PinpointException on failure\n// after\ntry {\n    Class<?> c = injector.injectClass(classLoader, className);\n} catch (PinpointException e) {\n    logger.error(\"inject failed for {} cause:{}\", className, e.getCause());\n    throw e;\n}","handlingStrategy":"try-catch","validationCode":"boolean isUrl = targetClassLoader instanceof URLClassLoader;\nif (!isUrl && !isPlainSupported(targetClassLoader)) { throw new IllegalArgumentException(\"unsupported classloader: \" + targetClassLoader.getClass()); }","typeGuard":"static boolean supportsInjection(ClassLoader cl) {\n    return cl instanceof URLClassLoader || isPlainClassLoader(cl);\n}","tryCatchPattern":"try { return injector.injectClass(classLoader, className); } catch (PinpointException e) { log.error(\"inject {} failed, cause: {}\", className, e.getCause(), e); throw e; }","preventionTips":["Deduplicate and integrity-check plugin jars","Confirm target classloader can see plugin classes and deps","Route URL vs plain loaders correctly","Investigate any LinkageError causes for double-definition races"],"tags":["classloader","plugin","instrumentation"],"backgroundTag":"class-not-found","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}