{"record":{"id":"c45f9e0683bf5a9c","repo":"apache/beam","slug":"found-multiple-schematransformprovider-implementations-with","errorCode":null,"errorMessage":"Found multiple SchemaTransformProvider implementations with the same identifier ","messagePattern":"Found multiple SchemaTransformProvider implementations with the same identifier ","errorType":"exception","errorClass":"java.lang.IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/expansion-service/src/main/java/org/apache/beam/sdk/expansion/service/ExpansionServiceSchemaTransformProvider.java","lineNumber":56,"sourceCode":"import org.apache.beam.vendor.grpc.v1p69p0.com.google.protobuf.InvalidProtocolBufferException;\nimport org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap;\nimport org.checkerframework.checker.nullness.qual.Nullable;\n\n@SuppressWarnings({\"rawtypes\"})\npublic class ExpansionServiceSchemaTransformProvider\n    implements TransformProvider<PCollectionRowTuple, PCollectionRowTuple> {\n\n  private Map<String, org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider>\n      schemaTransformProviders = new HashMap<>();\n  private static @Nullable ExpansionServiceSchemaTransformProvider transformProvider = null;\n\n  private ExpansionServiceSchemaTransformProvider() {\n    try {\n      for (org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider schemaTransformProvider :\n          ServiceLoader.load(\n              org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider.class)) {\n        if (schemaTransformProviders.containsKey(schemaTransformProvider.identifier())) {\n          throw new IllegalArgumentException(\n              \"Found multiple SchemaTransformProvider implementations with the same identifier \"\n                  + schemaTransformProvider.identifier());\n        }\n        schemaTransformProviders.put(schemaTransformProvider.identifier(), schemaTransformProvider);\n      }\n    } catch (Exception e) {\n      throw new RuntimeException(e.getMessage());\n    }\n  }\n\n  public static ExpansionServiceSchemaTransformProvider of() {\n    if (transformProvider == null) {\n      transformProvider = new ExpansionServiceSchemaTransformProvider();\n    }\n\n    return transformProvider;\n  }\n","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/expansion-service/src/main/java/org/apache/beam/sdk/expansion/service/ExpansionServiceSchemaTransformProvider.java#L38-L74","documentation":"The expansion service discovers SchemaTransformProvider implementations via Java's ServiceLoader (META-INF/services). The private constructor of ExpansionServiceSchemaTransformProvider throws IllegalArgumentException if two providers on the classpath advertise the same identifier(). This prevents ambiguous dispatch of transform requests.","triggerScenarios":"Constructing the singleton ExpansionServiceSchemaTransformProvider (e.g., at expansion service startup) when the classpath contains two jars each registering a SchemaTransformProvider with an identical identifier in META-INF/services/org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider.","commonSituations":"Two different versions of the same provider jar on the classpath (e.g., beam-sdks-java-io-google-ads-platform vs vendored copy); a fat jar bundling duplicate service registrations; classpath 'shade' duplicates from transitive dependencies.","solutions":["Run mvn dependency:tree (or gradle dependencies) to find duplicate jars providing the same SchemaTransformProvider identifier and exclude one","Check META-INF/services/org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider entries across all jars for the conflicting identifier","Pin/upstream a single version of the provider library and rebuild the classpath","If duplicates are intentional (different versions), use a classloader/shading configuration that isolates them"],"exampleFix":"// before (pom.xml)\n<dependency><groupId>org.apache.beam</groupId><artifactId>beam-sdks-java-io-myio</artifactId></dependency>\n<dependency><groupId>com.vendor</groupId><artifactId>myio-legacy</artifactId></dependency> // same identifier\n// after\n<dependency><groupId>com.vendor</groupId><artifactId>myio-legacy</artifactId><exclusions><exclusion><groupId>org.apache.beam</groupId><artifactId>beam-sdks-java-io-myio</artifactId></exclusion></exclusions></dependency>","handlingStrategy":"validation","validationCode":"// Before building the service jar, check for duplicate registrations:\n// unzip -p each jar META-INF/services/org.apache.beam.sdk.schemas.transforms.SchemaTransformProvider | sort | uniq -d","typeGuard":null,"tryCatchPattern":"try { service = ExpansionService.create(args); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Found multiple SchemaTransformProvider\")) { /* dedupe classpath */ } throw e; }","preventionTips":["Keep exactly one version of each provider jar on the classpath","Run dependency:tree in CI to detect duplicate provider artifacts","Use maven-shade-plugin ServicesResourceTransformer to merge/dedupe service files"],"tags":["java","classpath","serviceloader"],"backgroundTag":"conflicting-config-options","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}