{"record":{"id":"4aabf72fca28b2d2","repo":"quarkusio/quarkus","slug":"quarkus-update-artifacts-require-multiple-rewrite","errorCode":null,"errorMessage":"quarkus update artifacts require multiple rewrite plugin versions: ${propRewritePluginVersion} and ${pluginVersion}","messagePattern":"quarkus update artifacts require multiple rewrite plugin versions: (.+?) and (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/rewrite/QuarkusUpdatesRepository.java","lineNumber":101,"sourceCode":"                List<String> newRecipes = fetchUpdateRecipes(log, resourceLoader, \"quarkus-updates\",\n                        recipeDirectoryNames);\n                recipes.addAll(newRecipes);\n                final Properties props = resourceLoader.loadResourceAsPath(\"quarkus-updates/\", p -> {\n                    final Properties properties = new Properties();\n                    final Path propPath = p.resolve(\"recipes.properties\");\n                    if (Files.isRegularFile(propPath)) {\n                        try (final InputStream inStream = Files.newInputStream(propPath)) {\n                            properties.load(inStream);\n                        }\n                    }\n                    return properties;\n                });\n\n                final String pluginVersion = getPropRewritePluginVersion(props, buildTool);\n                if (propRewritePluginVersion == null) {\n                    propRewritePluginVersion = pluginVersion;\n                } else if (!propRewritePluginVersion.equals(pluginVersion)) {\n                    throw new RuntimeException(\n                            \"quarkus update artifacts require multiple rewrite plugin versions: \" + propRewritePluginVersion\n                                    + \" and \" + pluginVersion);\n                }\n                if (log.isDebugEnabled()) {\n                    log.debug(String.format(\n                            \"=> %d specific recipe\" + (recipes.size() != 1 ? \"s\" : \"\")\n                                    + \" found (compatible with OpenRewrite %s plugin version: %s)\",\n                            recipes.size(),\n                            buildTool,\n                            propRewritePluginVersion));\n                } else {\n                    log.info(String.format(\n                            \"=> %s specific recipe\" + (recipes.size() != 1 ? \"s\" : \"\") + \" found\",\n                            MessageFormatter.green(String.valueOf(recipes.size()))));\n                }\n\n            } catch (BootstrapMavenException e) {\n                throw new RuntimeException(\"Failed to resolve artifact: \" + gav, e);","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/rewrite/QuarkusUpdatesRepository.java#L83-L119","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use update artifacts that all come from the same Quarkus stream/version so their rewrite plugin versions match.","Rebuild the custom recipe artifact against the same rewrite-maven-plugin version as the other artifacts.","Update Quarkus / the CLI so the generated update artifacts and the rewrite plugin versions are aligned.","Run `quarkus update` separately for each artifact group that requires a different plugin version."],"exampleFix":"// before: mixing streams\nquarkusUpdate --update-versions=3.2 --artifact=io.quarkus:quarkus-update-recipes:3.8\n// after: artifact version matches the target stream\nquarkusUpdate --update-versions=3.2 --artifact=io.quarkus:quarkus-update-recipes:3.2","handlingStrategy":"validation","validationCode":"// Ensure all artifacts resolve from one Quarkus stream and pin one rewrite plugin version\n// in each artifact's quarkus-update-properties before mixing them in one update run.","typeGuard":null,"tryCatchPattern":"try {\n    FetchResult r = repo.fetchRecipes(artifacts, buildTool, ...);\n} catch (RuntimeException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"multiple rewrite plugin versions\")) {\n        log.error(\"Update artifacts conflict on rewrite plugin version; use artifacts from the same stream.\");\n    }\n}","preventionTips":["Use update artifacts that all match the target Quarkus stream version.","Pin the same rewrite-maven-plugin/rewrite-gradle-plugin version in custom recipe artifacts.","Keep the Quarkus CLI and update artifacts versions aligned.","Split update runs by stream if you must use artifacts from different sources."],"tags":["maven","version-conflict","update-recipes"],"backgroundTag":"version-conflict","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}