From f0d860268b7b91831ae79a77a85082c2b8c2bcc5 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 23 Jun 2026 21:57:22 +0200 Subject: [PATCH] [#12353] Add jaxb2-maven-plugin to mvnup plugin upgrade list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jaxb2-maven-plugin versions before 3.2.0 depend on jaxb-parent:3.0.0 which contains `` — an element with an undeclared namespace prefix. Maven 4's namespace-aware StAX parser rejects this invalid XML, causing transitive dependencies (jaxb-core, jaxb-impl) to be lost from the plugin classrealm, resulting in ClassNotFoundException at runtime. jaxb-parent:3.0.2 (used by jaxb2-maven-plugin 3.2.0+) fixed this by using `-Xlint:all` instead. Co-Authored-By: Claude Opus 4.6 --- .../mvnup/goals/PluginUpgradeStrategy.java | 10 ++++- .../goals/PluginUpgradeStrategyTest.java | 39 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java index 3402b78c2fa9..e454c30e3f4e 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java @@ -97,7 +97,12 @@ public class PluginUpgradeStrategy extends AbstractUpgradeStrategy { DEFAULT_MAVEN_PLUGIN_GROUP_ID, "maven-resources-plugin", "3.3.1", - "Beta/RC versions compiled against different Maven 4 API signatures")); + "Beta/RC versions compiled against different Maven 4 API signatures"), + new PluginUpgrade( + "org.codehaus.mojo", + "jaxb2-maven-plugin", + "3.2.0", + "Versions before 3.2.0 depend on jaxb-parent:3.0.0 which contains invalid XML rejected by Maven 4")); private static final List PLUGIN_DEPENDENCY_UPGRADES = List.of(new PluginUpgrade( "org.codehaus.mojo", @@ -270,6 +275,9 @@ private Map getPluginUpgradesMap() { upgrades.put( DEFAULT_MAVEN_PLUGIN_GROUP_ID + ":maven-resources-plugin", new PluginUpgradeInfo(DEFAULT_MAVEN_PLUGIN_GROUP_ID, "maven-resources-plugin", "3.3.1")); + upgrades.put( + "org.codehaus.mojo:jaxb2-maven-plugin", + new PluginUpgradeInfo("org.codehaus.mojo", "jaxb2-maven-plugin", "3.2.0")); return upgrades; } diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java index 3702a07e05ac..4d42f1e394cf 100644 --- a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java +++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java @@ -430,6 +430,45 @@ void shouldUpgradeSurefireReportPluginWhenBelowMinimum() throws Exception { assertEquals("3.5.2", version); } + @Test + @DisplayName("should upgrade jaxb2-maven-plugin when below minimum") + void shouldUpgradeJaxb2MavenPluginWhenBelowMinimum() throws Exception { + String pomXml = """ + + + 4.0.0 + test + test + 1.0.0 + + + + org.codehaus.mojo + jaxb2-maven-plugin + 3.1.0 + + + + + """; + + Document document = Document.of(pomXml); + Map pomMap = Map.of(Paths.get("pom.xml"), document); + + UpgradeContext context = createMockContext(); + UpgradeResult result = strategy.doApply(context, pomMap); + + assertTrue(result.success(), "Plugin upgrade should succeed"); + assertTrue(result.modifiedCount() > 0, "Should have upgraded jaxb2-maven-plugin"); + + Editor editor = new Editor(document); + Element root = editor.root(); + String version = root.path("build", "plugins", "plugin", "version") + .map(Element::textContentTrimmed) + .orElse(null); + assertEquals("3.2.0", version); + } + @Test @DisplayName("should not upgrade when version is already higher") void shouldNotUpgradeWhenVersionAlreadyHigher() throws Exception {