From 7fc81d5998460ca95ee5349c6777a403ccae2897 Mon Sep 17 00:00:00 2001 From: Sylwester Lachiewicz Date: Wed, 16 Sep 2026 01:16:02 +0200 Subject: [PATCH 1/2] Bump Error Prone to 2.50.0, requires Java 21 Error Prone 2.37.0 reads JCCompilationUnit.endPositions, which JDK 27 removed (JDK-8372948), so javac-with-errorprone fails on JDK 27. Error Prone fixed that in 2.47.0, and every release since 2.43.0 needs a JDK 21 runtime, so the errorprone module and the ITs move their javaVersion to 21. Since 2.46.0 Error Prone on JDK 21 also refuses to run without -XDaddTypeAnnotationsToSymbol=true, so the two ITs pass it. --- plexus-compiler-its/pom.xml | 2 +- plexus-compiler-its/src/main/it/error-prone-compiler/pom.xml | 1 + plexus-compiler-its/src/main/it/issues-351/pom.xml | 1 + plexus-compilers/plexus-compiler-javac-errorprone/pom.xml | 2 +- .../src/site/markdown/index.md | 2 +- .../plexus/compiler/javac/JavacErrorProneCompilerTest.java | 3 ++- pom.xml | 2 +- 7 files changed, 8 insertions(+), 5 deletions(-) diff --git a/plexus-compiler-its/pom.xml b/plexus-compiler-its/pom.xml index 3fa5a7e62..e2ac1b1d7 100644 --- a/plexus-compiler-its/pom.xml +++ b/plexus-compiler-its/pom.xml @@ -15,7 +15,7 @@ 4.13.2 - 17 + 21 true diff --git a/plexus-compiler-its/src/main/it/error-prone-compiler/pom.xml b/plexus-compiler-its/src/main/it/error-prone-compiler/pom.xml index a50cee55d..5a8896259 100644 --- a/plexus-compiler-its/src/main/it/error-prone-compiler/pom.xml +++ b/plexus-compiler-its/src/main/it/error-prone-compiler/pom.xml @@ -49,6 +49,7 @@ true -XDcompilePolicy=simple + -XDaddTypeAnnotationsToSymbol=true -Xplugin:ErrorProne --should-stop=ifError=FLOW -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED diff --git a/plexus-compiler-its/src/main/it/issues-351/pom.xml b/plexus-compiler-its/src/main/it/issues-351/pom.xml index 15ffe11a6..5eb49dd2f 100644 --- a/plexus-compiler-its/src/main/it/issues-351/pom.xml +++ b/plexus-compiler-its/src/main/it/issues-351/pom.xml @@ -55,6 +55,7 @@ -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED -XDcompilePolicy=simple + -XDaddTypeAnnotationsToSymbol=true --should-stop=ifError=FLOW -Xplugin:ErrorProne -Xep:DeadException:WARN diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml index f8e96af38..60e51ba00 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml +++ b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml @@ -16,7 +16,7 @@ See https://errorprone.info - 17 + 21 diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/site/markdown/index.md b/plexus-compilers/plexus-compiler-javac-errorprone/src/site/markdown/index.md index aa7f27659..efc5dbf5a 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/site/markdown/index.md +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/site/markdown/index.md @@ -6,4 +6,4 @@ with error-prone static analysis checks enabled. See https://errorprone.info -**Requires** `JDK 17+` +**Requires** `JDK 21+` diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java index 2e6eb9a2a..553e06af6 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java @@ -17,7 +17,8 @@ protected int expectedWarnings() { String javaVersion = getJavaVersion(); if (javaVersion.startsWith("1.8")) { return 1; - } else if (javaVersion.contains("21") || javaVersion.contains("25")) { + } else if (Runtime.version().feature() >= 21) { + // javac 21 and later also warn that -source 8 and -target 8 are obsolete return 5; } return 2; diff --git a/pom.xml b/pom.xml index a001176cd..d9241c184 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ true 2026-09-09T11:47:52Z 1.9.21 - 2.37.0 + 2.50.0 1.1.0 false clean install From bf7eea9818cf1e01881e318703da26007d7ac3cc Mon Sep 17 00:00:00 2001 From: Sylwester Lachiewicz Date: Wed, 16 Sep 2026 01:35:19 +0200 Subject: [PATCH 2/2] Derive test expectations from the JDK feature version The javac and eclipse compiler tests listed the JDKs they knew (11, 17, 21, 25) by substring, so any other JDK fell back to Java 1.3 source settings or to expecting ReservedWord.class, and the suite failed on JDK 26 and 27. A shared getJavaFeatureVersion() replaces the lists. --- .../plexus/compiler/AbstractCompilerTest.java | 16 ++++ .../EclipseCompilerErrorsAsWarningsTest.java | 7 +- .../EclipseCompilerFailOnWarningsTest.java | 8 +- .../compiler/eclipse/EclipseCompilerTest.java | 8 +- .../javac/JavacErrorProneCompilerTest.java | 2 +- .../javac/AbstractJavacCompilerTest.java | 87 +++---------------- 6 files changed, 36 insertions(+), 92 deletions(-) diff --git a/plexus-compiler-test/src/main/java/org/codehaus/plexus/compiler/AbstractCompilerTest.java b/plexus-compiler-test/src/main/java/org/codehaus/plexus/compiler/AbstractCompilerTest.java index 026e0b4a0..1426caf24 100644 --- a/plexus-compiler-test/src/main/java/org/codehaus/plexus/compiler/AbstractCompilerTest.java +++ b/plexus-compiler-test/src/main/java/org/codehaus/plexus/compiler/AbstractCompilerTest.java @@ -310,4 +310,20 @@ protected String getJavaVersion() { return javaVersion; } + + /** + * Returns the feature version of the running JDK: 8 for {@code 1.8.x}, otherwise the leading number of + * {@code java.version}, such as 17 or 27. + */ + protected int getJavaFeatureVersion() { + String javaVersion = System.getProperty("java.version"); + if (javaVersion.startsWith("1.")) { + javaVersion = javaVersion.substring(2); + } + int end = 0; + while (end < javaVersion.length() && Character.isDigit(javaVersion.charAt(end))) { + end++; + } + return Integer.parseInt(javaVersion.substring(0, end)); + } } diff --git a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerErrorsAsWarningsTest.java b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerErrorsAsWarningsTest.java index 86e118d08..505c1bbe3 100644 --- a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerErrorsAsWarningsTest.java +++ b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerErrorsAsWarningsTest.java @@ -36,11 +36,8 @@ protected int expectedWarnings() { @Override protected Collection expectedOutputFiles() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + // assert is a keyword since Java 1.4, so ReservedWord does not compile on a modern source level + if (getJavaFeatureVersion() >= 9) { return Arrays.asList( "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class", diff --git a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerFailOnWarningsTest.java b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerFailOnWarningsTest.java index 6dc10e0cf..2058b38f0 100644 --- a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerFailOnWarningsTest.java +++ b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerFailOnWarningsTest.java @@ -29,12 +29,8 @@ protected int expectedWarnings() { @Override protected Collection expectedOutputFiles() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("9.0") - || javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + // assert is a keyword since Java 1.4, so ReservedWord does not compile on a modern source level + if (getJavaFeatureVersion() >= 9) { return Arrays.asList( "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class", diff --git a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerTest.java b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerTest.java index e8422d8e0..4082d7010 100644 --- a/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerTest.java +++ b/plexus-compilers/plexus-compiler-eclipse/src/test/java/org/codehaus/plexus/compiler/eclipse/EclipseCompilerTest.java @@ -62,12 +62,8 @@ protected int expectedWarnings() { @Override protected Collection expectedOutputFiles() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("9.0") - || javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + // assert is a keyword since Java 1.4, so ReservedWord does not compile on a modern source level + if (getJavaFeatureVersion() >= 9) { return Arrays.asList( "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class", diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java index 553e06af6..aba9e12d1 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java @@ -17,7 +17,7 @@ protected int expectedWarnings() { String javaVersion = getJavaVersion(); if (javaVersion.startsWith("1.8")) { return 1; - } else if (Runtime.version().feature() >= 21) { + } else if (getJavaFeatureVersion() >= 21) { // javac 21 and later also warn that -source 8 and -target 8 are obsolete return 5; } diff --git a/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/AbstractJavacCompilerTest.java b/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/AbstractJavacCompilerTest.java index b6d3293a4..b3c6a4bf2 100644 --- a/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/AbstractJavacCompilerTest.java +++ b/plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/AbstractJavacCompilerTest.java @@ -61,16 +61,12 @@ protected String getRoleHint() { @Override protected int expectedErrors() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + if (getJavaFeatureVersion() >= 11) { return 5; } // javac output changed for misspelled modifiers starting in 1.6...they now generate 2 errors per occurrence, // not one. - if ("1.5".compareTo(javaVersion) < 0) { + if ("1.5".compareTo(getJavaVersion()) < 0) { return 4; } else { return 3; @@ -79,103 +75,46 @@ protected int expectedErrors() { @Override protected int expectedWarnings() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + if (getJavaFeatureVersion() >= 11) { return 1; } + String javaVersion = getJavaVersion(); if (javaVersion.contains("1.8")) { // lots of new warnings about obsoletions for future releases return 30; } - if ("1.6".compareTo(javaVersion) < 0) { // with 1.7 some warning with bootstrap class path not set in conjunction with -source 1.3 return 9; } - return 2; } @Override public String getTargetVersion() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("9.0")) { + int javaFeatureVersion = getJavaFeatureVersion(); + if (javaFeatureVersion >= 11) { + return Integer.toString(javaFeatureVersion); + } else if (getJavaVersion().contains("9.0")) { return "1.7"; - } else if (javaVersion.contains("11")) { - return "11"; - } else if (javaVersion.contains("14")) { - return "14"; - } else if (javaVersion.contains("15")) { - return "15"; - } else if (javaVersion.contains("16")) { - return "16"; - } else if (javaVersion.contains("17")) { - return "17"; - } else if (javaVersion.contains("18")) { - return "18"; - } else if (javaVersion.contains("19")) { - return "19"; - } else if (javaVersion.contains("20")) { - return "20"; - } else if (javaVersion.contains("21")) { - return "21"; - } else if (javaVersion.contains("22")) { - return "22"; - } else if (javaVersion.contains("23")) { - return "23"; - } else if (javaVersion.contains("24")) { - return "24"; - } else if (javaVersion.contains("25")) { - return "25"; } return super.getTargetVersion(); } @Override public String getSourceVersion() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("9.0")) { + int javaFeatureVersion = getJavaFeatureVersion(); + if (javaFeatureVersion >= 11) { + return Integer.toString(javaFeatureVersion); + } else if (getJavaVersion().contains("9.0")) { return "1.7"; - } else if (javaVersion.contains("11")) { - return "11"; - } else if (javaVersion.contains("14")) { - return "14"; - } else if (javaVersion.contains("15")) { - return "15"; - } else if (javaVersion.contains("16")) { - return "16"; - } else if (javaVersion.contains("17")) { - return "17"; - } else if (javaVersion.contains("18")) { - return "18"; - } else if (javaVersion.contains("19")) { - return "19"; - } else if (javaVersion.contains("20")) { - return "20"; - } else if (javaVersion.contains("21")) { - return "21"; - } else if (javaVersion.contains("22")) { - return "22"; - } else if (javaVersion.contains("23")) { - return "23"; - } else if (javaVersion.contains("24")) { - return "24"; - } else if (javaVersion.contains("25")) { - return "25"; } return super.getSourceVersion(); } @Override protected Collection expectedOutputFiles() { - String javaVersion = getJavaVersion(); - if (javaVersion.contains("11") - || javaVersion.contains("17") - || javaVersion.contains("21") - || javaVersion.contains("25")) { + if (getJavaFeatureVersion() >= 11) { return Arrays.asList( "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class",