From dd842cbd620442c48e121492c1b239145cce6786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kohlschu=CC=88tter?= Date: Tue, 26 Sep 2023 17:08:42 +0200 Subject: [PATCH] plugin: Try to get "jdk 1.8" from toolchains.xml, bump Maven to >= 3.3.9 Previously, we were OK getting any JDK version from the build context. This breaks the Maven plugin when executing with a too new Java version (e.g., 20). Filter through the toolchains available in toolchains.xml, and use the first working one that is marked "jdk 1.8". This change requires updating the Maven Plugin API requirement. --- retrolambda-maven-plugin/pom.xml | 14 ++++-- .../retrolambda/maven/ProcessClassesMojo.java | 46 +++++++++++++------ .../maven/ProcessTestClassesMojo.java | 9 ++-- .../maven/ProcessClassesMojoTest.java | 13 +++++- 4 files changed, 60 insertions(+), 22 deletions(-) diff --git a/retrolambda-maven-plugin/pom.xml b/retrolambda-maven-plugin/pom.xml index 951a593c..20f39a86 100644 --- a/retrolambda-maven-plugin/pom.xml +++ b/retrolambda-maven-plugin/pom.xml @@ -13,7 +13,7 @@ maven-plugin - 3.0 + 3.3.9 @@ -29,10 +29,17 @@ ${project.version} + + org.apache.maven + maven-core + 3.3.9 + provided + org.apache.maven maven-plugin-api - 3.0 + 3.3.9 + provided org.apache.maven.plugin-tools @@ -50,7 +57,7 @@ org.twdata.maven mojo-executor - 2.2.0 + 2.4.1-m2 @@ -70,6 +77,7 @@ maven-toolchains-plugin + 3.1.0 diff --git a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java index 122decd6..04690dae 100644 --- a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java +++ b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java @@ -222,21 +222,37 @@ private void retrieveRetrolambdaJar(String version) throws MojoExecutionExceptio } String getJavaCommand() { - String javaCommand = getJavaCommand(new File(System.getProperty("java.home"))); - - Toolchain tc = toolchainManager.getToolchainFromBuildContext("jdk", session); - if (tc != null) { - getLog().info("Toolchain in retrolambda-maven-plugin: " + tc); - javaCommand = tc.findTool("java"); - } - - if (java8home != null) { - if (tc != null) { - getLog().warn("Toolchains are ignored, 'java8home' parameter is set to " + java8home); - } - javaCommand = getJavaCommand(java8home); - } - return javaCommand; + String javaCommand = null; + + List tcCandidates = toolchainManager.getToolchains(session, "jdk", Collections + .singletonMap("version", "1.8")); + for (Toolchain tc : tcCandidates) { + String cmd = tc.findTool("java"); + if (cmd != null) { + getLog().info("Toolchain in retrolambda-maven-plugin: " + tc); + javaCommand = cmd; + break; + } + } + + Toolchain tc = toolchainManager.getToolchainFromBuildContext("jdk", session); + if (javaCommand == null && tc != null) { + getLog().info("Toolchain in retrolambda-maven-plugin: " + tc); + javaCommand = tc.findTool("java"); + } + + if (java8home != null) { + if (tc != null) { + getLog().warn("Toolchains are ignored, 'java8home' parameter is set to " + java8home); + } + javaCommand = getJavaCommand(java8home); + } + + if (javaCommand == null) { + javaCommand = getJavaCommand(new File(System.getProperty("java.home"))); + } + + return javaCommand; } private static String getJavaCommand(File javaHome) { diff --git a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessTestClassesMojo.java b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessTestClassesMojo.java index 0060a714..00d9215f 100644 --- a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessTestClassesMojo.java +++ b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessTestClassesMojo.java @@ -4,12 +4,15 @@ package net.orfjackal.retrolambda.maven; -import org.apache.maven.artifact.DependencyResolutionRequiredException; -import org.apache.maven.plugins.annotations.*; - import java.io.File; import java.util.List; +import org.apache.maven.artifact.DependencyResolutionRequiredException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; + /** * Processes test classes compiled with Java 8 so that they will be compatible with * Java 5, 6 or 7 runtime. diff --git a/retrolambda-maven-plugin/src/test/java/net/orfjackal/retrolambda/maven/ProcessClassesMojoTest.java b/retrolambda-maven-plugin/src/test/java/net/orfjackal/retrolambda/maven/ProcessClassesMojoTest.java index cfdbbcb7..023df0b9 100644 --- a/retrolambda-maven-plugin/src/test/java/net/orfjackal/retrolambda/maven/ProcessClassesMojoTest.java +++ b/retrolambda-maven-plugin/src/test/java/net/orfjackal/retrolambda/maven/ProcessClassesMojoTest.java @@ -76,9 +76,20 @@ public Toolchain getToolchainFromBuildContext(String type, MavenSession context) return toolChainsByType.get(type); } - public void setJdkToolChain(JavaToolChain toolChain) { + public void setJdkToolChain(JavaToolchain toolChain) { toolChainsByType.put("jdk", toolChain); } + + @Override + public List getToolchains(MavenSession session, String type, + Map requirements) { + Toolchain tc = toolChainsByType.get("jdk"); + if(tc == null) { + return Collections.emptyList(); + } else { + return Collections.singletonList(tc); + } + } } private static class FakeJavaToolChain extends DefaultJavaToolChain {