OpenAPITools/openapi-generator · error · MojoExecutionException

Invalid mergeConflictStrategy value '${mergeConflictStrategy

Error message

Invalid mergeConflictStrategy value '${mergeConflictStrategy}'. Valid values are: WARN, FAIL

What it means

Thrown by CodeGenMojo.execute when mergeMode is DEEP and MergedSpecBuilder.MergeConflictStrategy.valueOf(mergeConflictStrategy.toUpperCase(Locale.ROOT)) throws IllegalArgumentException — the configured <mergeConflictStrategy> is not WARN or FAIL (case-insensitive, not trimmed). The conflict strategy is only resolved in DEEP mode, so an invalid value passes silently in REF mode and fails here only after a valid DEEP mergeMode.

Source

Thrown at modules/openapi-generator-maven-plugin/src/main/java/org/openapitools/codegen/plugin/CodeGenMojo.java:645

            }
            MergedSpecBuilder.MergeMode resolvedMergeMode;
            try {
                resolvedMergeMode = MergedSpecBuilder.MergeMode.valueOf(mergeMode.toUpperCase(Locale.ROOT));
            } catch (IllegalArgumentException e) {
                throw new MojoExecutionException("Invalid mergeMode value '" + mergeMode
                        + "'. Valid values are: REF, DEEP");
            }

            MergedSpecBuilder builder = new MergedSpecBuilder(inputSpecFiles, mergedFileOutputDir.getAbsolutePath(),
                    mergedFileName, mergedFileInfoName, mergedFileInfoDescription, mergedFileInfoVersion, auth)
                    .withMergeMode(resolvedMergeMode);

            if (resolvedMergeMode == MergedSpecBuilder.MergeMode.DEEP) {
                try {
                    builder.withConflictStrategy(
                            MergedSpecBuilder.MergeConflictStrategy.valueOf(mergeConflictStrategy.toUpperCase(Locale.ROOT)));
                } catch (IllegalArgumentException e) {
                    throw new MojoExecutionException("Invalid mergeConflictStrategy value '" + mergeConflictStrategy
                            + "'. Valid values are: WARN, FAIL");
                }
            }

            inputSpec = builder.buildMergedSpec();
            LOGGER.info("Merged input spec from explicit file list: {}", inputSpec);
        } else if (StringUtils.isNotBlank(inputSpecRootDirectory)) {
            // make sure the path can be processed correct under Windows OS
            inputSpecRootDirectory = inputSpecRootDirectory.replaceAll("\\\\", "/");

            MergedSpecBuilder.MergeMode resolvedMergeMode;
            try {
                resolvedMergeMode = MergedSpecBuilder.MergeMode.valueOf(mergeMode.toUpperCase(Locale.ROOT));
            } catch (IllegalArgumentException e) {
                throw new MojoExecutionException("Invalid mergeMode value '" + mergeMode
                        + "'. Valid values are: REF, DEEP");
            }

View on GitHub (pinned to fcec517be3)

Solutions

  1. Set <mergeConflictStrategy>WARN</mergeConflictStrategy> or <mergeConflictStrategy>FAIL</mergeConflictStrategy> (casing is normalized, whitespace is not).
  2. Remember this property is only validated when <mergeMode>DEEP</mergeMode> — a bad value hides in REF mode, so fix it now to avoid a later failure.
  3. Remove whitespace/newlines inside the element if the value already looks correct.

Example fix

<!-- before -->
<mergeMode>DEEP</mergeMode>
<mergeConflictStrategy>OVERWRITE</mergeConflictStrategy>

<!-- after -->
<mergeMode>DEEP</mergeMode>
<mergeConflictStrategy>FAIL</mergeConflictStrategy>
Defensive patterns

Strategy: validation

Validate before calling

# pre-check mergeConflictStrategy when mergeMode=DEEP
if [ "$MODE" = "DEEP" ]; then
  CS=$(mvn -q help:evaluate -Dexpression=mergeConflictStrategy -DforceStdout 2>/dev/null)
  echo "$CS" | tr '[:lower:]' '[:upper:]' | grep -qx '\(WARN\|FAIL\)' || { echo "invalid mergeConflictStrategy: $CS"; exit 1; }
fi

Prevention

When it happens

Trigger: Configuring <mergeMode>DEEP</mergeMode> together with <mergeConflictStrategy>OVERWRITE</mergeConflictStrategy>, <mergeConflictStrategy>fail_on_conflict</mergeConflictStrategy>, or a value with stray whitespace, while also using <inputSpecFiles>. With mergeMode REF the branch is skipped and the bad value is never checked.

Common situations: Switching from REF to DEEP merging to get conflict detection and guessing at strategy names; sharing POM snippets across teams where one side used a newer/older vocabulary; IDE autocompleting a similarly named property from a different plugin.

Related errors


AI-assisted analysis of OpenAPITools/openapi-generator@fcec517be3 (2026-08-22). Data as JSON: /api/errors/e19473f824c73f9d. Report an issue: GitHub.