pinpoint-apm/pinpoint · error · PinpointException

Failed to load plugin class {} with classLoader {}

Error message

Failed to load plugin class {} with classLoader {}

What it means

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.

Source

Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/PluginClassInjector.java:79

    }

    @Override
    public <T> Class<? extends T> injectClass(ClassLoader classLoader, String className) {
        try {
            if (bootstrapCore.isBootstrapPackage(className)) {
                return bootstrapCore.loadClass(className);
            }

            if (bootstrapClassLoader == classLoader) {
                return bootstrapClassLoaderHandler.injectClass(null, className);
            } else if (classLoader instanceof URLClassLoader) {
                return urlClassLoaderHandler.injectClass(classLoader, className);
            } else {
                return plainClassLoaderHandler.injectClass(classLoader, className);
            }
        } catch (Throwable e) {
            // fixed for LinkageError
            logger.warn("Failed to load plugin class {} with classLoader {}", className, classLoader, e);
            throw new PinpointException("Failed to load plugin class " + className + " with classLoader " + classLoader, e);
        }
    }

    @Override
    public InputStream getResourceAsStream(ClassLoader targetClassLoader, String internalName) {
        try {
            if (bootstrapCore.isBootstrapPackageByInternalName(internalName)) {
                return bootstrapCore.openStream(internalName);
            }
            if (targetClassLoader == null) {
                return bootstrapClassLoaderHandler.getResourceAsStream(null, internalName);
            } else if (targetClassLoader instanceof URLClassLoader) {
                final URLClassLoader urlClassLoader = (URLClassLoader) targetClassLoader;
                return urlClassLoaderHandler.getResourceAsStream(urlClassLoader, internalName);
            } else {
                return plainClassLoaderHandler.getResourceAsStream(targetClassLoader, internalName);
            }

View on GitHub (pinned to 744c3d3075)

Solutions

  1. Inspect the cause chain of the PinpointException to identify the failing handler and root error.
  2. Remove duplicate/corrupt plugin jars from the plugin directory.
  3. Ensure the plugin class and its dependencies are visible to the target classloader (or bootstrap path if bootstrap-routed).
  4. For LinkageError, check for the same class being defined twice (concurrent transform) or conflicting plugin versions.

Example fix

// before
Class<?> c = injector.injectClass(classLoader, className); // PinpointException on failure
// after
try {
    Class<?> c = injector.injectClass(classLoader, className);
} catch (PinpointException e) {
    logger.error("inject failed for {} cause:{}", className, e.getCause());
    throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

boolean isUrl = targetClassLoader instanceof URLClassLoader;
if (!isUrl && !isPlainSupported(targetClassLoader)) { throw new IllegalArgumentException("unsupported classloader: " + targetClassLoader.getClass()); }

Type guard

static boolean supportsInjection(ClassLoader cl) {
    return cl instanceof URLClassLoader || isPlainClassLoader(cl);
}

Try / catch

try { return injector.injectClass(classLoader, className); } catch (PinpointException e) { log.error("inject {} failed, cause: {}", className, e.getCause(), e); throw e; }

Prevention

When it happens

Trigger: Any Throwable from urlClassLoaderHandler.injectClass or plainClassLoaderHandler.injectClass — ClassNotFound, LinkageError/duplicate definition, ClassCastException from bad routing, or errors inside define0.

Common situations: 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).

Related errors


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/8f3cf2136b43e924. Report an issue: GitHub.