SeaTunnel documentation already explains how to configure connectors and how isolated dependencies are laid out in the binary package. What is still easy to miss is the runtime path between a job config and a loaded plugin instance.
This page explains that path at a system level:
SeaTunnel needs to support a large plugin ecosystem across sources, sinks, transforms, and formats. At runtime it has to answer a few questions safely:
Without a discovery and class-loading layer, adding connectors would quickly lead to dependency conflicts and fragile startup behavior.
At a high level, a plugin goes through this path:
Job Config -> parse plugin name -> discover factory -> validate options -> resolve connector jar and isolated dependencies -> create plugin classloader -> instantiate source / sink / transform -> execute inside engine runtime
Each step matters for a different reason:
At runtime SeaTunnel distinguishes plugins by a logical identity, typically combining:
This identity is used in multiple places:
Most user-visible plugins are created through factory interfaces. In practice, SeaTunnel relies on Java SPI and factory discovery helpers to locate implementations declared under META-INF/services.
Typical examples include:
TableSourceFactoryTableSinkFactoryThis is why connector development docs require factory registration and service metadata.
Related docs:
SeaTunnel separates the plugin jar from connector-specific third-party dependencies.
Typical runtime layout:
SEATUNNEL_HOME/ connectors/ connector-jdbc-<version>.jar plugins/ connector-jdbc/ dependency-a.jar dependency-b.jar
The mapping between plugin name and dependency directory is managed through plugin-mapping.properties.
This gives SeaTunnel two useful properties:
Related docs:
Different connectors may depend on different versions of the same third-party library. If all jars were loaded into one flat classpath, a single dependency conflict could break unrelated connectors in the same job.
Isolation helps in three places:
The most important practical difference is that SeaTunnel Engine (Zeta) gives stronger connector dependency isolation for job execution. The existing isolated dependency document already calls out that Spark and Flink still have tighter classpath sharing, so mixed versions remain more risky there.
That distinction is important when:
ClassNotFoundException or NoSuchMethodErrorPlugin discovery is not only used to instantiate runtime classes. It also powers metadata-oriented capabilities, such as exposing connector options to REST API and Web UI clients.
This is why the plugin system needs access to factory-level metadata such as:
OptionRuleRelated docs:
When plugin loading fails, the symptom often tells you which layer is broken.
Typical symptoms:
Usually means:
Typical symptoms:
Usually means:
Typical symptoms:
ClassNotFoundExceptionNoClassDefFoundErrorNoSuchMethodErrorUsually means:
When a plugin cannot be loaded correctly, check these items in order:
${SEATUNNEL_HOME}/plugins/ correct?plugin-mapping.properties map the plugin to the expected directory?When adding a new plugin, verify these items before debugging engine internals:
OptionRule covers required, optional, and exclusive fieldsUseful code entry points:
seatunnel-api/src/main/java/org/apache/seatunnel/api/table/factory/FactoryUtil.javaseatunnel-engine/seatunnel-engine-common/src/main/java/org/apache/seatunnel/engine/common/utils/FactoryUtil.javaseatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/ClassLoaderService.javaseatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/classloader/DefaultClassLoaderService.javaseatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/OptionRulesService.java