apache/seatunnel · error · org.apache.seatunnel.api.metadata.MetadataProviderException
Multiple MetadataProvider implementations found for kind
Error message
Multiple MetadataProvider implementations found for kind '%s'. Ambiguous provider classes are: %s
What it means
MetadataProviderFactory.getProvider found two or more SPI implementations whose kind() matches the requested kind (case-insensitive), so it cannot pick one deterministically. The message lists the ambiguous class names. The input at fault is the plugin classpath containing duplicate providers registering the same kind string (e.g. two copies of the Gravitino provider or a forked plugin reusing the kind).
Solutions
- Check the ambiguous classes listed in the message and remove the duplicate jar from the plugin/connectors directory
- Ensure each MetadataProvider implementation returns a unique kind() value
- If you forked a provider, rename its kind() so it no longer collides
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/metadata/MetadataProviderFactory.java:63 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/778f060aff6e57da.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/metadata/MetadataProviderFactory.java:63
* @param kind the kind identifier of the provider to find
* @return the provider
* @throws MetadataProviderException if provider is not found or multiple providers with the
* same kind are found
*/
public static MetadataProvider getProvider(String kind) {
List<MetadataProvider> providers = loadProviders();
MetadataProvider matchedProvider = null;
List<String> matchedKinds = new ArrayList<>();
for (MetadataProvider provider : providers) {
if (provider.kind().equalsIgnoreCase(kind)) {
if (matchedProvider != null) {
log.error(
"Multiple MetadataProvider implementations found for kind '{}': {}",
kind,
matchedKinds);
throw new MetadataProviderException(
String.format(
"Multiple MetadataProvider implementations found for kind '%s'.\n\n"
+ "Ambiguous provider classes are:\n\n%s",
kind, String.join("\n", matchedKinds)));
}
matchedProvider = provider;
matchedKinds.add(provider.getClass().getName());
}
}
if (matchedProvider == null) {
List<String> availableKinds = new ArrayList<>();
for (MetadataProvider provider : providers) {
availableKinds.add(provider.kind());
}
log.debug("No MetadataProvider found for kind: {}", kind);
throw new MetadataProviderException(
String.format(View on GitHub (pinned to cf67b549a7)