{"record":{"id":"9f67adcd78c74b32","repo":"alibaba/canal","slug":"more-than-1-default-extension-name-on-extension","errorCode":null,"errorMessage":"more than 1 default extension name on extension {}: {}","messagePattern":"more than 1 default extension name on extension (.+?): (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java","lineNumber":256,"sourceCode":"                                         // the app using Spring Tools Suit play\n                                         // button.\n            jarPath = jarPath.replaceAll(\"/classes/.*\", \"/classes/\");\n        }\n        Path path = Paths.get(jarPath).getParent(); // Paths - from java 8\n        if (path != null) {\n            return path.toString();\n        }\n        return null;\n    }\n\n    private Map<String, Class<?>> loadExtensionClasses() {\n        final SPI defaultAnnotation = type.getAnnotation(SPI.class);\n        if (defaultAnnotation != null) {\n            String value = defaultAnnotation.value();\n            if ((value = value.trim()).length() > 0) {\n                String[] names = NAME_SEPARATOR.split(value);\n                if (names.length > 1) {\n                    throw new IllegalStateException(\"more than 1 default extension name on extension \" + type.getName()\n                                                    + \": \" + Arrays.toString(names));\n                }\n                if (names.length == 1) cachedDefaultName = names[0];\n            }\n        }\n\n        Map<String, Class<?>> extensionClasses = new HashMap<>();\n\n        // 1. plugin folder，customized extension classLoader （jar_dir/plugin）\n        String dir = File.separator + this.getJarDirectoryPath() + File.separator + \"plugin\";\n\n        File externalLibDir = new File(dir);\n        if (!externalLibDir.exists()) {\n            externalLibDir = new File(File.separator + this.getJarDirectoryPath() + File.separator + \"canal-adapter\"\n                                      + File.separator + \"plugin\");\n        }\n        logger.info(\"extension classpath dir: \" + externalLibDir.getAbsolutePath());\n        if (externalLibDir.exists()) {","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java#L238-L274","documentation":"Error \"more than 1 default extension name on extension {}: {}\" thrown in alibaba/canal.","triggerScenarios":"Thrown at client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java:256 when the library encounters an invalid state.","commonSituations":"Multiple default extensions declared for one SPI. Reject the configuration at load time; exactly one default (or none) must be enforced.","solutions":["Declare only one @SPI default name on the extension interface; remove duplicate default names.","Check for duplicated SPI annotations introduced by shading/merging of jars."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}