{"record":{"id":"237740fdb3c6be22","repo":"pinpoint-apm/pinpoint","slug":"failed-to-load-plugin-resource-as-stream-with-c","errorCode":null,"errorMessage":"Failed to load plugin resource as stream {} with classLoader","messagePattern":"Failed to load plugin resource as stream (.+?) with classLoader","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/BootstrapClassLoaderHandler.java","lineNumber":93,"sourceCode":"                // Reordering is not recommended.\n                this.injectedToRoot = true;\n            }\n        }\n    }\n\n    @Override\n    public InputStream getResourceAsStream(ClassLoader targetClassLoader, String internalName) {\n        try {\n            if (targetClassLoader == null) {\n                ClassLoader classLoader = ClassLoader.getSystemClassLoader();\n                if (classLoader == null) {\n                    return null;\n                }\n                appendToBootstrapClassLoaderSearch();\n                return classLoader.getResourceAsStream(internalName);\n            }\n        } catch (Exception e) {\n            logger.warn(\"Failed to load plugin resource as stream {} with classLoader\", internalName, e);\n            return null;\n        }\n        logger.warn(\"Invalid bootstrap class loader. cl={}\", targetClassLoader);\n        return null;\n    }\n}","sourceCodeStart":75,"sourceCodeEnd":99,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/BootstrapClassLoaderHandler.java#L75-L99","documentation":"BootstrapClassLoaderHandler.getResourceAsStream tries to return the bytecode stream of a plugin class resource from the bootstrap classloader. If appendToBootstrapClassLoaderSearch or getResourceAsStream throws, the handler logs this warn and returns null instead of propagating. A null result means callers (e.g. bytecode reading) cannot obtain the plugin class resource.","triggerScenarios":"Any Exception (I/O, security, ClassCastException on the loader, etc.) thrown while appending to bootstrap search or fetching internalName as a stream from the bootstrap classloader.","commonSituations":"Plugin jar not on the bootstrap path; resource name (internal name with .class) mistyped; security manager denying classloader access; plugin jar unreadable.","solutions":["Inspect the exception stack trace attached to this warn for the root cause.","Verify the plugin jar is appended to the bootstrap classloader search before resource lookup.","Check the internalName ends with .class and matches the packaged resource path.","Ensure callers handle a null InputStream return value."],"exampleFix":"// before\nInputStream in = injector.getResourceAsStream(cl, internalName);\nbyte[] bytes = IOUtils.toByteArray(in); // NPE if null\n// after\nInputStream in = injector.getResourceAsStream(cl, internalName);\nif (in == null) {\n    logger.warn(\"plugin resource {} unavailable\", internalName);\n    return null;\n}","handlingStrategy":"fallback","validationCode":"if (targetClassLoader != Object.class.getClassLoader()) { throw new IllegalArgumentException(\"not bootstrap loader\"); }","typeGuard":null,"tryCatchPattern":"InputStream in = handler.getResourceAsStream(cl, internalName);\nif (in == null) { log.warn(\"no bytecode stream for {}\", internalName); return null; }","preventionTips":["Null-check the returned stream before use","Ensure appendToBootstrapClassLoaderSearch succeeded before lookup","Use correct internalName format (path/Foo.class)","Watch for security-manager denials in the log"],"tags":["classloader","plugin","resource","io"],"backgroundTag":"resource-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"}