apache/seatunnel · critical · SeaTunnelException

load flink starter error.

Error message

load flink starter error.

What it means

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.

Solutions

  1. Run sh bin/install-plugin.sh <version> to install starter jars into the connectors directory
  2. Verify the flink starter jar exists in <seatunnel_home>/connectors and matches the deployed SeaTunnel version
  3. Check FLINK_HOME and seatunnel connector paths in the startup script/env for typos or illegal characters
  4. Re-download/rebuild SeaTunnel if the starter jar is corrupt

Example fix

// before
sh bin/seatunnel.sh --config job.conf -e flink  # connectors dir empty
// after
sh bin/install-plugin.sh 2.3.x
sh bin/seatunnel.sh --config job.conf -e flink
Defensive patterns

Strategy: validation

Validate before calling

Path starterJar = Common.appStarterDir().resolve(FlinkStarter.APP_JAR_NAME);
if (!java.nio.file.Files.exists(starterJar)) {
    throw new IllegalStateException("Missing starter jar: " + starterJar);
}

Try / catch

try {
    new FlinkExecution(config, ...);
} catch (SeaTunnelException e) {
    log.error("Starter jar load failed; run install-plugin.sh", e);
}

Prevention

When it happens

Trigger: 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.

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

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/a0e91635f05b552d. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-core/seatunnel-flink-starter/seatunnel-flink-starter-common/src/main/java/org/apache/seatunnel/core/starter/flink/execution/FlinkExecution.java:98

    private final PluginExecuteProcessor<DataStreamTableInfo, FlinkRuntimeEnvironment>
            transformPluginExecuteProcessor;
    private final PluginExecuteProcessor<DataStreamTableInfo, FlinkRuntimeEnvironment>
            sinkPluginExecuteProcessor;
    private final List<URL> jarPaths;

    public FlinkExecution(Config config) {
        try {
            jarPaths =
                    new ArrayList<>(
                            Collections.singletonList(
                                    new File(
                                                    Common.appStarterDir()
                                                            .resolve(FlinkStarter.APP_JAR_NAME)
                                                            .toString())
                                            .toURI()
                                            .toURL()));
        } catch (MalformedURLException e) {
            throw new SeaTunnelException("load flink starter error.", e);
        }
        Config envConfig = config.getConfig("env");
        registerPlugin(envConfig);
        JobContext jobContext = new JobContext();
        jobContext.setJobMode(RuntimeEnvironment.getJobMode(config));
        jobContext.setEnableCheckpoint(RuntimeEnvironment.getEnableCheckpoint(config));

        this.sourcePluginExecuteProcessor =
                new SourceExecuteProcessor(
                        jarPaths, envConfig, config.getConfigList(Constants.SOURCE), jobContext);
        this.transformPluginExecuteProcessor =
                new TransformExecuteProcessor(
                        jarPaths,
                        envConfig,
                        TypesafeConfigUtils.getConfigList(
                                config, Constants.TRANSFORM, Collections.emptyList()),
                        jobContext);
        this.sinkPluginExecuteProcessor =

View on GitHub (pinned to cf67b549a7)