quarkusio/quarkus · error · RuntimeException

quarkus update artifacts require multiple rewrite plugin ver

Error message

quarkus update artifacts require multiple rewrite plugin versions: ${propRewritePluginVersion} and ${pluginVersion}

What it means

While fetching recipes for a `quarkus update` operation, QuarkusUpdatesRepository.fetchRecipes() resolves the rewrite plugin version property for each artifact/build tool. If different artifacts in the same batch declare conflicting rewrite-maven/gradle-plugin versions, the method aborts with RuntimeException because a single consistent plugin version is required to run the update.

Source

Thrown at independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/rewrite/QuarkusUpdatesRepository.java:101

                List<String> newRecipes = fetchUpdateRecipes(log, resourceLoader, "quarkus-updates",
                        recipeDirectoryNames);
                recipes.addAll(newRecipes);
                final Properties props = resourceLoader.loadResourceAsPath("quarkus-updates/", p -> {
                    final Properties properties = new Properties();
                    final Path propPath = p.resolve("recipes.properties");
                    if (Files.isRegularFile(propPath)) {
                        try (final InputStream inStream = Files.newInputStream(propPath)) {
                            properties.load(inStream);
                        }
                    }
                    return properties;
                });

                final String pluginVersion = getPropRewritePluginVersion(props, buildTool);
                if (propRewritePluginVersion == null) {
                    propRewritePluginVersion = pluginVersion;
                } else if (!propRewritePluginVersion.equals(pluginVersion)) {
                    throw new RuntimeException(
                            "quarkus update artifacts require multiple rewrite plugin versions: " + propRewritePluginVersion
                                    + " and " + pluginVersion);
                }
                if (log.isDebugEnabled()) {
                    log.debug(String.format(
                            "=> %d specific recipe" + (recipes.size() != 1 ? "s" : "")
                                    + " found (compatible with OpenRewrite %s plugin version: %s)",
                            recipes.size(),
                            buildTool,
                            propRewritePluginVersion));
                } else {
                    log.info(String.format(
                            "=> %s specific recipe" + (recipes.size() != 1 ? "s" : "") + " found",
                            MessageFormatter.green(String.valueOf(recipes.size()))));
                }

            } catch (BootstrapMavenException e) {
                throw new RuntimeException("Failed to resolve artifact: " + gav, e);

View on GitHub (pinned to e1c734241f)

Solutions

  1. Use update artifacts that all come from the same Quarkus stream/version so their rewrite plugin versions match.
  2. Rebuild the custom recipe artifact against the same rewrite-maven-plugin version as the other artifacts.
  3. Update Quarkus / the CLI so the generated update artifacts and the rewrite plugin versions are aligned.
  4. Run `quarkus update` separately for each artifact group that requires a different plugin version.

Example fix

// before: mixing streams
quarkusUpdate --update-versions=3.2 --artifact=io.quarkus:quarkus-update-recipes:3.8
// after: artifact version matches the target stream
quarkusUpdate --update-versions=3.2 --artifact=io.quarkus:quarkus-update-recipes:3.2
Defensive patterns

Strategy: validation

Validate before calling

// Ensure all artifacts resolve from one Quarkus stream and pin one rewrite plugin version
// in each artifact's quarkus-update-properties before mixing them in one update run.

Try / catch

try {
    FetchResult r = repo.fetchRecipes(artifacts, buildTool, ...);
} catch (RuntimeException e) {
    if (e.getMessage() != null && e.getMessage().contains("multiple rewrite plugin versions")) {
        log.error("Update artifacts conflict on rewrite plugin version; use artifacts from the same stream.");
    }
}

Prevention

When it happens

Trigger: Calling fetchRecipes with multiple update artifacts whose quarkus-update-properties files define different values for the rewrite plugin version property (PROP_REWRITE_MAVEN_PLUGIN_VERSION / PROP_REWRITE_GRADLE_PLUGIN_VERSION), so propRewritePluginVersion differs from pluginVersion on a later artifact.

Common situations: Mixing update recipe artifacts built against different Quarkus versions (e.g. one older stream artifact plus a current one) in the same `quarkus update` invocation; a custom recipe artifact pinning its own rewrite plugin version that disagrees with the platform-generated one.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/4aabf72fca28b2d2. Report an issue: GitHub.