apache/seatunnel · error · ConfigCheckException
At least one source plugin must be configured.
Error message
At least one source plugin must be configured.
What it means
validate requires the job config to declare at least one source plugin under the 'source' block. If the resulting source table list is empty it throws ConfigCheckException('At least one source plugin must be configured.').
Solutions
- Add a source { ... } block with a valid plugin to the job config
- Ensure 'source' is a list of plugin configs per HOCON conventions
- Verify the plugin name inside source is recognized (no silent filtering)
Example fix
// before
env {...}
sink { Console {} }
// after
env {...}
source { Fake { rows = 10 } }
sink { Console {} } Defensive patterns
Strategy: validation
Validate before calling
boolean hasSource = config.hasPath("source") && !config.getConfigList("source").isEmpty(); if (!hasSource) throw new IllegalArgumentException("config must define a source block"); Try / catch
try { ConfigValidationUtils.validate(config); } catch (ConfigCheckException e) { log.error("Job config invalid: {}", e.getMessage()); } Prevention
- Template job configs with source/sink/env blocks
- Lint configs before submission
- Never rename the reserved 'source' key
When it happens
Trigger: A job config with no 'source' section, an empty source list, or a source section whose entries were filtered out by TypesafeConfigUtils.getConfigList (wrong type, e.g. source as object instead of array).
Common situations: Copy-pasting only the sink half of an example, renaming 'source' to something else, or writing source as a single object when a list is expected.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- ILLEGAL_CONFIG_ARGUMENT
- Option 'batch_size' must be between 1 and 32
- Option 'field_delimiter' cannot be empty
- Option 'max_in_flight_messages' must be greater than or…
- Option 'poll_interval_ms' must be greater than zero
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/746358f15993205b.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-core/seatunnel-core-starter/src/main/java/org/apache/seatunnel/core/starter/utils/ConfigValidationUtils.java:133
throw new ConfigCheckException(checkResult.getMsg());
}
ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader validationClassLoader = prepareClassLoader(config, parentClassLoader);
Thread.currentThread().setContextClassLoader(validationClassLoader);
try {
validateEnvironmentConfig(config);
JobContext jobContext = new JobContext();
jobContext.setJobMode(RuntimeEnvironment.getJobMode(config));
jobContext.setEnableCheckpoint(RuntimeEnvironment.getEnableCheckpoint(config));
List<TableInfo> sourceTables =
validateSources(
TypesafeConfigUtils.getConfigList(
config, Constants.SOURCE, Collections.emptyList()),
jobContext);
if (sourceTables.isEmpty()) {
throw new ConfigCheckException("At least one source plugin must be configured.");
}
List<TableInfo> outputTables =
validateTransforms(
sourceTables,
TypesafeConfigUtils.getConfigList(
config, Constants.TRANSFORM, Collections.emptyList()),
jobContext);
validateSinks(
outputTables,
TypesafeConfigUtils.getConfigList(
config, Constants.SINK, Collections.emptyList()),
jobContext);
} catch (ConfigCheckException e) {
throw e;
} catch (Exception e) {
Throwable rootException = ExceptionUtils.getRootException(e);View on GitHub (pinned to cf67b549a7)