{"record":{"id":"5fd88d2656b5a942","repo":"apache/seatunnel","slug":"config-validation-failed-5fd88d","errorCode":"CONFIG_VALIDATION_FAILED","errorMessage":"PluginName: %s, PluginType: %s, Message: %s (Cannot find paimon catalog factory)","messagePattern":"PluginName: (.+?), PluginType: (.+?), Message: (.+?) \\(Cannot find paimon catalog factory\\)","errorType":"error_code","errorClass":"PaimonConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/catalog/PaimonCatalog.java","lineNumber":342,"sourceCode":"                throw new PaimonConnectorException(\n                        PaimonConnectorErrorCode.WRITE_PROPS_BUCKET_KEY_ERROR, message);\n            }\n        }\n        throw new CatalogException(\"An unexpected error occurred\", e);\n    }\n\n    // --------------------------------------------------------------------------------------------\n    // SPI load paimon catalog\n    // --------------------------------------------------------------------------------------------\n\n    public static PaimonCatalog loadPaimonCatalog(ReadonlyConfig readonlyConfig) {\n        org.apache.seatunnel.api.table.factory.CatalogFactory catalogFactory =\n                discoverFactory(\n                        Thread.currentThread().getContextClassLoader(),\n                        org.apache.seatunnel.api.table.factory.CatalogFactory.class,\n                        PaimonSink.PLUGIN_NAME);\n        if (catalogFactory == null) {\n            throw new PaimonConnectorException(\n                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                    String.format(\n                            \"PluginName: %s, PluginType: %s, Message: %s\",\n                            PaimonSink.PLUGIN_NAME,\n                            PluginType.SINK,\n                            \"Cannot find paimon catalog factory\"));\n        }\n        return (PaimonCatalog)\n                catalogFactory.createCatalog(catalogFactory.factoryIdentifier(), readonlyConfig);\n    }\n\n    // --------------------------------------------------------------------------------------------\n    // alterTable\n    // --------------------------------------------------------------------------------------------\n\n    public void alterTable(\n            Identifier identifier, SchemaChange schemaChange, boolean ignoreIfNotExists) {\n        try {","sourceCodeStart":324,"sourceCodeEnd":360,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/catalog/PaimonCatalog.java#L324-L360","documentation":"PaimonConnectorException with code CONFIG_VALIDATION_FAILED thrown by loadPaimonCatalog when no SeaTunnel CatalogFactory for the Paimon plugin can be discovered on the current thread's context classloader — i.e. the Paimon connector plugin/factory is missing from the plugin discovery path.","triggerScenarios":"Classloader lacks the paimon connector factory (connector jar not installed in SEATUNNEL_HOME/connectors), SPI service file not on classpath, or plugin name mismatch during FactoryUtil discovery.","commonSituations":"Running seatunnel.sh without connector-paimon jar installed (install-plugin.sh not run); fat-jar builds excluding META-INF/services entries; custom classloader setups where Thread.currentThread().getContextClassLoader() differs from the app classloader.","solutions":["Install the Paimon connector jar into $SEATUNNEL_HOME/connectors (sh bin/install-plugin.sh)","Verify META-INF/services/org.apache.seatunnel.api.table.factory.Factory contains the Paimon catalog factory in the jar","Ensure the plugin is on the process classpath (check classloader.resolve-order settings)","If embedding SeaTunnel, set the context classloader before calling loadPaimonCatalog"],"exampleFix":"// before: connector missing\nsh bin/seatunnel.sh --config job.conf -e local\n// after: install plugin first\nsh bin/install-plugin.sh\nsh bin/seatunnel.sh --config job.conf -e local","handlingStrategy":"validation","validationCode":"// before submitting the job\nif (new java.io.File(\"/opt/seatunnel/connectors/connector-paimon\").getParentFile()\n        .list((d, n) -> n.startsWith(\"connector-paimon\")) == null) {\n    throw new IllegalStateException(\"paimon connector jar not installed\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    PaimonCatalog catalog = new PaimonCatalog(...);\n    catalog.open(...);\n} catch (PaimonConnectorException e) {\n    if (e.getErrorCode() == SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED) {\n        throw new IllegalStateException(\"Install connector-paimon: sh bin/install-plugin.sh\", e);\n    }\n}","preventionTips":["Run install-plugin.sh or ship connector-paimon jar with your deployment","Verify META-INF/services Factory SPI entries survive fat-jar shading","Check classloader.resolve-order settings when embedding","Smoke-test catalog.open() early in CI pipelines"],"tags":["paimon","spi","plugin-not-found","classloader"],"backgroundTag":"missing-dependency","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}