{"record":{"id":"a0e91635f05b552d","repo":"apache/seatunnel","slug":"load-flink-starter-error","errorCode":null,"errorMessage":"load flink starter error.","messagePattern":"load flink starter error\\.","errorType":"exception","errorClass":"SeaTunnelException","httpStatus":null,"severity":"critical","filePath":"seatunnel-core/seatunnel-flink-starter/seatunnel-flink-starter-common/src/main/java/org/apache/seatunnel/core/starter/flink/execution/FlinkExecution.java","lineNumber":98,"sourceCode":"    private final PluginExecuteProcessor<DataStreamTableInfo, FlinkRuntimeEnvironment>\n            transformPluginExecuteProcessor;\n    private final PluginExecuteProcessor<DataStreamTableInfo, FlinkRuntimeEnvironment>\n            sinkPluginExecuteProcessor;\n    private final List<URL> jarPaths;\n\n    public FlinkExecution(Config config) {\n        try {\n            jarPaths =\n                    new ArrayList<>(\n                            Collections.singletonList(\n                                    new File(\n                                                    Common.appStarterDir()\n                                                            .resolve(FlinkStarter.APP_JAR_NAME)\n                                                            .toString())\n                                            .toURI()\n                                            .toURL()));\n        } catch (MalformedURLException e) {\n            throw new SeaTunnelException(\"load flink starter error.\", e);\n        }\n        Config envConfig = config.getConfig(\"env\");\n        registerPlugin(envConfig);\n        JobContext jobContext = new JobContext();\n        jobContext.setJobMode(RuntimeEnvironment.getJobMode(config));\n        jobContext.setEnableCheckpoint(RuntimeEnvironment.getEnableCheckpoint(config));\n\n        this.sourcePluginExecuteProcessor =\n                new SourceExecuteProcessor(\n                        jarPaths, envConfig, config.getConfigList(Constants.SOURCE), jobContext);\n        this.transformPluginExecuteProcessor =\n                new TransformExecuteProcessor(\n                        jarPaths,\n                        envConfig,\n                        TypesafeConfigUtils.getConfigList(\n                                config, Constants.TRANSFORM, Collections.emptyList()),\n                        jobContext);\n        this.sinkPluginExecuteProcessor =","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-starter-common/src/main/java/org/apache/seatunnel/core/starter/flink/execution/FlinkExecution.java#L80-L116","documentation":"FlinkExecution's constructor builds a classloader URL for the Flink starter jar under Common.appStarterDir() and registers it. If the jar path is not a valid URL (typically because the starter jar is missing or the connector/connectors dir is misconfigured), it wraps the MalformedURLException in a SeaTunnelException.","triggerScenarios":"Starting a Flink job via seatunnel.sh where the flink starter jar (seatunnel-flink-*-starter jar) cannot be resolved to a valid URL in the connector directory.","commonSituations":"Connectors never installed (install-plugin.sh not run); FLINK_HOME/connectors directory misconfigured or moved; wrong SeaTunnel version jars deployed; corrupted starter dir path with illegal URL characters (e.g. spaces).","solutions":["Run sh bin/install-plugin.sh <version> to install starter jars into the connectors directory","Verify the flink starter jar exists in <seatunnel_home>/connectors and matches the deployed SeaTunnel version","Check FLINK_HOME and seatunnel connector paths in the startup script/env for typos or illegal characters","Re-download/rebuild SeaTunnel if the starter jar is corrupt"],"exampleFix":"// before\nsh bin/seatunnel.sh --config job.conf -e flink  # connectors dir empty\n// after\nsh bin/install-plugin.sh 2.3.x\nsh bin/seatunnel.sh --config job.conf -e flink","handlingStrategy":"validation","validationCode":"Path starterJar = Common.appStarterDir().resolve(FlinkStarter.APP_JAR_NAME);\nif (!java.nio.file.Files.exists(starterJar)) {\n    throw new IllegalStateException(\"Missing starter jar: \" + starterJar);\n}","typeGuard":null,"tryCatchPattern":"try {\n    new FlinkExecution(config, ...);\n} catch (SeaTunnelException e) {\n    log.error(\"Starter jar load failed; run install-plugin.sh\", e);\n}","preventionTips":["Run sh bin/install-plugin.sh after installing SeaTunnel","Verify connectors/ contains the flink starter jar before launching","Avoid spaces or special characters in SeaTunnel install paths","Pin connector versions to the SeaTunnel release version"],"tags":["flink","classpath","starter-jar","startup"],"backgroundTag":"file-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}