From d72d4518468391354798208aebc9ee94cd37e0d6 Mon Sep 17 00:00:00 2001 From: Sylwester Lachiewicz Date: Thu, 10 Sep 2026 23:19:00 +0200 Subject: [PATCH] Accept the 1.x spelling for the javac release version -source and -target take both 8 and 1.8, --release takes only 8, and javac rejects the other form with "release version 1.8 not supported". Mapping 1.5 to 1.8 onto 5 to 8 lets a parent POM derive the release from the target a child already declares, whatever spelling it uses. The Eclipse compiler already does the same for 1.9. --- .../plexus/compiler/javac/JavacCompiler.java | 17 +++++++++++++- .../javac/AbstractJavacCompilerTest.java | 22 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java index f1b18d4a..9dd44fdc 100644 --- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java +++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java @@ -347,6 +347,21 @@ protected InProcessCompiler inProcessCompiler() { return inProcessCompiler; } + /** + * Maps the {@code 1.x} spelling that {@code -source} and {@code -target} accept onto the plain feature + * number, the only form {@code --release} takes: {@code 1.8} becomes {@code 8}. Any other value is + * passed through unchanged, so javac still reports releases it does not support. + * + * @param release the configured release version, never empty + * @return the value to pass to {@code --release} + */ + static String toReleaseArgument(String release) { + if (release.length() == 3 && release.startsWith("1.") && release.charAt(2) >= '1' && release.charAt(2) <= '9') { + return release.substring(2); + } + return release; + } + /** * * @return {@code true} if the current context class loader has access to {@code javax.tools.ToolProvider} @@ -492,7 +507,7 @@ public static String[] buildCompilerArguments( if (JavaVersion.JAVA_9.isOlderOrEqualTo(javacVersion) && !StringUtils.isEmpty(config.getReleaseVersion())) { args.add("--release"); - args.add(config.getReleaseVersion()); + args.add(toReleaseArgument(config.getReleaseVersion())); } else { // TODO: this could be much improved if (StringUtils.isEmpty(config.getTargetVersion())) { 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 d8e90677..b6d3293a 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 @@ -477,6 +477,28 @@ public void testReleaseVersion() { internalTest(compilerConfiguration, expectedArguments, "11.0.1"); } + @Test + public void testReleaseVersionInLegacySpelling() { + List expectedArguments = new ArrayList<>(); + + CompilerConfiguration compilerConfiguration = new CompilerConfiguration(); + + // outputLocation + compilerConfiguration.setOutputLocation("/output"); + expectedArguments.add("-d"); + expectedArguments.add(new File("/output").getAbsolutePath()); + + // releaseVersion in the -source/-target spelling, which --release rejects + compilerConfiguration.setReleaseVersion("1.8"); + expectedArguments.add("--release"); + expectedArguments.add("8"); + + // unshared table + expectedArguments.add("-XDuseUnsharedTable=true"); + + internalTest(compilerConfiguration, expectedArguments, "11.0.1"); + } + @Test public void testFailOnWarning() { List expectedArguments = new ArrayList<>();