From 7bbd6d0bc1cf565dd6c5272da0f8b4155c3245f3 Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Mon, 1 Dec 2025 15:04:09 +1300 Subject: [PATCH 1/4] feat(maven): detect current javac --- .../canonical/rockcraft/maven/Toolchain.java | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java b/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java index beed0fad..3ddc088c 100644 --- a/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java +++ b/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java @@ -21,6 +21,39 @@ public final class Toolchain { private Toolchain() { } + private static String getToolchainJavacPath(ToolchainManager toolchainManager) { + if (toolchainManager == null) { + return null; + } + org.apache.maven.toolchain.Toolchain jdkToolchain = toolchainManager.getToolchainFromBuildContext("jdk", session); + if (jdkToolchain == null) { + return null; + } + return jdkToolchain.findTool("javac"); + } + + private static String getJavacPath(ToolchainManager toolchainManager) { + String where = getToolchainJavacPath(toolchainManager); + if (where != null) { + return where; + } + String javaHome = System.getProperty("java.home"); + if (javaHome == null || javaHome.isEmpty()) { + log.warn("java-rockcraft-plugin: please configure Maven toolchain or provide a valid Java Home."); + return null; + } + Path java9Path = Paths.get(javaHome, "bin", "javac"); + Path java8Path = Paths.get(Paths.get(javaHome).getParent(), "bin", "javac"); + + if (Files.isExecutable(java9Path)) { + return java9Path; + } else if (Files.isExecutable(java8Path)) { + return java8Path; + } + log.warn("java-rockcraft-plugin: please configure Maven toolchain or provide a valid Java Home: "+ javaHome); + return null; + } + /** * Gets the toolchain settings for the project * @@ -31,21 +64,11 @@ private Toolchain() { */ public static String getToolchainPackage(MavenSession session, ToolchainManager toolchainManager, Log log) { try { - if (toolchainManager == null) { - log.warn("java-rockcraft-plugin: Maven Toolchain manager is not present."); - return ToolchainHelper.DEFAULT_JDK; - } - System.err.println("---- has toolchain manager --- "); - org.apache.maven.toolchain.Toolchain jdkToolchain = toolchainManager.getToolchainFromBuildContext("jdk", session); - if (jdkToolchain == null) { - log.warn("java-rockcraft-plugin: Maven Toolchain is not configured. Please configure toolchain or use buildPackage configuration"); - return ToolchainHelper.DEFAULT_JDK; - } - String tool = jdkToolchain.findTool("javac"); + String tool = getJavacPath(toolchainManager); if (tool == null) { - log.warn("java-rockcraft-plugin: Maven Toolchain - javac tool is not found."); return ToolchainHelper.DEFAULT_JDK; } + ToolchainHelper.ToolchainPackage p = ToolchainHelper.getBuildPackage(tool); switch (p.getReason()) { case JAVAC_ERROR: From 78cbc9f0b9c315b975b254ace423c086ccd9403f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Dec 2025 02:04:58 +0000 Subject: [PATCH 2/4] Initial plan From c02a92bcf6d5cf7e8d70ea9432c5273483deeb52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Dec 2025 02:11:56 +0000 Subject: [PATCH 3/4] Fix Toolchain.java compilation errors Co-authored-by: vpa1977 <1978165+vpa1977@users.noreply.github.com> --- .../canonical/rockcraft/maven/Toolchain.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java b/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java index 3ddc088c..793eb16b 100644 --- a/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java +++ b/rockcraft-maven/src/main/java/com/canonical/rockcraft/maven/Toolchain.java @@ -10,6 +10,9 @@ import java.io.InputStreamReader; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashSet; import java.util.Arrays; @@ -21,7 +24,7 @@ public final class Toolchain { private Toolchain() { } - private static String getToolchainJavacPath(ToolchainManager toolchainManager) { + private static String getToolchainJavacPath(ToolchainManager toolchainManager, MavenSession session) { if (toolchainManager == null) { return null; } @@ -32,8 +35,8 @@ private static String getToolchainJavacPath(ToolchainManager toolchainManager) { return jdkToolchain.findTool("javac"); } - private static String getJavacPath(ToolchainManager toolchainManager) { - String where = getToolchainJavacPath(toolchainManager); + private static String getJavacPath(ToolchainManager toolchainManager, MavenSession session, Log log) { + String where = getToolchainJavacPath(toolchainManager, session); if (where != null) { return where; } @@ -43,12 +46,12 @@ private static String getJavacPath(ToolchainManager toolchainManager) { return null; } Path java9Path = Paths.get(javaHome, "bin", "javac"); - Path java8Path = Paths.get(Paths.get(javaHome).getParent(), "bin", "javac"); + Path java8Path = Paths.get(Paths.get(javaHome).getParent().toString(), "bin", "javac"); if (Files.isExecutable(java9Path)) { - return java9Path; + return java9Path.toString(); } else if (Files.isExecutable(java8Path)) { - return java8Path; + return java8Path.toString(); } log.warn("java-rockcraft-plugin: please configure Maven toolchain or provide a valid Java Home: "+ javaHome); return null; @@ -64,7 +67,7 @@ private static String getJavacPath(ToolchainManager toolchainManager) { */ public static String getToolchainPackage(MavenSession session, ToolchainManager toolchainManager, Log log) { try { - String tool = getJavacPath(toolchainManager); + String tool = getJavacPath(toolchainManager, session, log); if (tool == null) { return ToolchainHelper.DEFAULT_JDK; } @@ -72,13 +75,13 @@ public static String getToolchainPackage(MavenSession session, ToolchainManager ToolchainHelper.ToolchainPackage p = ToolchainHelper.getBuildPackage(tool); switch (p.getReason()) { case JAVAC_ERROR: - log.warn("java-rockcraft-plugin: Maven Toolchain - javac error {}, please set buildPackage configuration option: {}", tool, p.getRawOutput()); + log.warn("java-rockcraft-plugin: Maven Toolchain - javac error " + tool + ", please set buildPackage configuration option: " + p.getRawOutput()); break; case JAVAC_VERSION_STRING: - log.warn("java-rockcraft-plugin: Maven Toolchain - unable to parse javac version string, please set buildPackage configuration option: {}", p.getRawOutput()); + log.warn("java-rockcraft-plugin: Maven Toolchain - unable to parse javac version string, please set buildPackage configuration option: " + p.getRawOutput()); break; case JAVAC_UNSUPPORTED_VERSION_STRING: - log.warn("java-rockcraft-plugin: Maven Toolchain - unsupported version string, please set buildPackage configuration option. {}", p.getRawOutput()); + log.warn("java-rockcraft-plugin: Maven Toolchain - unsupported version string, please set buildPackage configuration option. " + p.getRawOutput()); break; } return p.getName(); From 82457869917d133f743e4b06e06317b93f4e5c35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Dec 2025 02:20:50 +0000 Subject: [PATCH 4/4] Add Maven integration tests for Toolchain detection with JDK 11 and 17 Co-authored-by: vpa1977 <1978165+vpa1977@users.noreply.github.com> --- .../src/it/toolchain-jdk11-test/foo/Foo.java | 7 +++ .../toolchain-jdk11-test/invoker.properties | 1 + .../src/it/toolchain-jdk11-test/pom.xml | 47 +++++++++++++++++++ .../src/it/toolchain-jdk11-test/prebuild.bsh | 21 +++++++++ .../it/toolchain-jdk11-test/toolchains.xml | 13 +++++ .../src/it/toolchain-jdk11-test/verify.bsh | 33 +++++++++++++ .../src/it/toolchain-jdk17-test/foo/Foo.java | 7 +++ .../toolchain-jdk17-test/invoker.properties | 1 + .../src/it/toolchain-jdk17-test/pom.xml | 47 +++++++++++++++++++ .../src/it/toolchain-jdk17-test/prebuild.bsh | 21 +++++++++ .../it/toolchain-jdk17-test/toolchains.xml | 13 +++++ .../src/it/toolchain-jdk17-test/verify.bsh | 33 +++++++++++++ 12 files changed, 244 insertions(+) create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/foo/Foo.java create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/invoker.properties create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/pom.xml create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/prebuild.bsh create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/toolchains.xml create mode 100644 rockcraft-maven/src/it/toolchain-jdk11-test/verify.bsh create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/foo/Foo.java create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/invoker.properties create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/pom.xml create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/prebuild.bsh create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/toolchains.xml create mode 100644 rockcraft-maven/src/it/toolchain-jdk17-test/verify.bsh diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/foo/Foo.java b/rockcraft-maven/src/it/toolchain-jdk11-test/foo/Foo.java new file mode 100644 index 00000000..7e8eca0c --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/foo/Foo.java @@ -0,0 +1,7 @@ +package foo; + +public class Foo { + public static void main(String[] args) { + System.out.println("Hello from JDK 11!"); + } +} diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/invoker.properties b/rockcraft-maven/src/it/toolchain-jdk11-test/invoker.properties new file mode 100644 index 00000000..beb82b12 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/invoker.properties @@ -0,0 +1 @@ +invoker.goals=--no-transfer-progress install -X diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/pom.xml b/rockcraft-maven/src/it/toolchain-jdk11-test/pom.xml new file mode 100644 index 00000000..aa6e0967 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/pom.xml @@ -0,0 +1,47 @@ + + foo + toolchain-jdk11-test + 1 + 4.0.0 + + 11 + 11 + + + ${project.basedir}/target + ${project.basedir}/target/classes + ${project.basedir}/target/test-classes + + + org.apache.maven.plugins + maven-toolchains-plugin + 3.2.0 + + + + toolchain + + + + + + + 11 + + + + + + io.github.rockcrafters + rockcraft-maven-plugin + + + + create-rock + + + + + + + diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/prebuild.bsh b/rockcraft-maven/src/it/toolchain-jdk11-test/prebuild.bsh new file mode 100644 index 00000000..5b8757ca --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/prebuild.bsh @@ -0,0 +1,21 @@ +import java.io.*; + +// Copy the toolchains.xml file to ~/.m2/ for this test +File toolchainsSource = new File(basedir, "toolchains.xml"); +File toolchainsTarget = new File(System.getProperty("user.home") + "/.m2/toolchains.xml"); + +// Ensure the directory exists +toolchainsTarget.getParentFile().mkdirs(); + +// Copy the file using streams +FileInputStream fis = new FileInputStream(toolchainsSource); +FileOutputStream fos = new FileOutputStream(toolchainsTarget); +byte[] buffer = new byte[1024]; +int length; +while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); +} +fis.close(); +fos.close(); + +System.out.println("Copied toolchains.xml to " + toolchainsTarget); diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/toolchains.xml b/rockcraft-maven/src/it/toolchain-jdk11-test/toolchains.xml new file mode 100644 index 00000000..fbfaf252 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/toolchains.xml @@ -0,0 +1,13 @@ + + + + jdk + + 11 + temurin + + + /usr/lib/jvm/temurin-11-jdk-amd64 + + + diff --git a/rockcraft-maven/src/it/toolchain-jdk11-test/verify.bsh b/rockcraft-maven/src/it/toolchain-jdk11-test/verify.bsh new file mode 100644 index 00000000..a83d27aa --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk11-test/verify.bsh @@ -0,0 +1,33 @@ +import java.io.*; + +// Check that the rockcraft.yaml file was created +File target = new File(basedir, "target"); + +File[] files = target.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + return name.equals("rockcraft.yaml"); + } +}); + +if (files == null || files.length == 0) { + throw new FileNotFoundException("Could not find generated rockcraft.yaml file in " + target); +} + +// Read the file and check for openjdk-11-jdk +File rockcraftYaml = files[0]; +BufferedReader reader = new BufferedReader(new FileReader(rockcraftYaml)); +String line; +boolean foundJdk11 = false; +while ((line = reader.readLine()) != null) { + if (line.contains("openjdk-11-jdk")) { + foundJdk11 = true; + break; + } +} +reader.close(); + +if (!foundJdk11) { + throw new RuntimeException("Expected to find openjdk-11-jdk in rockcraft.yaml, but it was not found."); +} + +System.out.println("SUCCESS: Toolchain correctly detected JDK 11 and set build-packages to openjdk-11-jdk"); diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/foo/Foo.java b/rockcraft-maven/src/it/toolchain-jdk17-test/foo/Foo.java new file mode 100644 index 00000000..9d2f7402 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/foo/Foo.java @@ -0,0 +1,7 @@ +package foo; + +public class Foo { + public static void main(String[] args) { + System.out.println("Hello from JDK 17!"); + } +} diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/invoker.properties b/rockcraft-maven/src/it/toolchain-jdk17-test/invoker.properties new file mode 100644 index 00000000..beb82b12 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/invoker.properties @@ -0,0 +1 @@ +invoker.goals=--no-transfer-progress install -X diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/pom.xml b/rockcraft-maven/src/it/toolchain-jdk17-test/pom.xml new file mode 100644 index 00000000..8ff3b135 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/pom.xml @@ -0,0 +1,47 @@ + + foo + toolchain-jdk17-test + 1 + 4.0.0 + + 17 + 17 + + + ${project.basedir}/target + ${project.basedir}/target/classes + ${project.basedir}/target/test-classes + + + org.apache.maven.plugins + maven-toolchains-plugin + 3.2.0 + + + + toolchain + + + + + + + 17 + + + + + + io.github.rockcrafters + rockcraft-maven-plugin + + + + create-rock + + + + + + + diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/prebuild.bsh b/rockcraft-maven/src/it/toolchain-jdk17-test/prebuild.bsh new file mode 100644 index 00000000..5b8757ca --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/prebuild.bsh @@ -0,0 +1,21 @@ +import java.io.*; + +// Copy the toolchains.xml file to ~/.m2/ for this test +File toolchainsSource = new File(basedir, "toolchains.xml"); +File toolchainsTarget = new File(System.getProperty("user.home") + "/.m2/toolchains.xml"); + +// Ensure the directory exists +toolchainsTarget.getParentFile().mkdirs(); + +// Copy the file using streams +FileInputStream fis = new FileInputStream(toolchainsSource); +FileOutputStream fos = new FileOutputStream(toolchainsTarget); +byte[] buffer = new byte[1024]; +int length; +while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); +} +fis.close(); +fos.close(); + +System.out.println("Copied toolchains.xml to " + toolchainsTarget); diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/toolchains.xml b/rockcraft-maven/src/it/toolchain-jdk17-test/toolchains.xml new file mode 100644 index 00000000..433eb6f2 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/toolchains.xml @@ -0,0 +1,13 @@ + + + + jdk + + 17 + temurin + + + /usr/lib/jvm/temurin-17-jdk-amd64 + + + diff --git a/rockcraft-maven/src/it/toolchain-jdk17-test/verify.bsh b/rockcraft-maven/src/it/toolchain-jdk17-test/verify.bsh new file mode 100644 index 00000000..39e25535 --- /dev/null +++ b/rockcraft-maven/src/it/toolchain-jdk17-test/verify.bsh @@ -0,0 +1,33 @@ +import java.io.*; + +// Check that the rockcraft.yaml file was created +File target = new File(basedir, "target"); + +File[] files = target.listFiles(new FilenameFilter(){ + public boolean accept(File dir, String name) { + return name.equals("rockcraft.yaml"); + } +}); + +if (files == null || files.length == 0) { + throw new FileNotFoundException("Could not find generated rockcraft.yaml file in " + target); +} + +// Read the file and check for openjdk-17-jdk +File rockcraftYaml = files[0]; +BufferedReader reader = new BufferedReader(new FileReader(rockcraftYaml)); +String line; +boolean foundJdk17 = false; +while ((line = reader.readLine()) != null) { + if (line.contains("openjdk-17-jdk")) { + foundJdk17 = true; + break; + } +} +reader.close(); + +if (!foundJdk17) { + throw new RuntimeException("Expected to find openjdk-17-jdk in rockcraft.yaml, but it was not found."); +} + +System.out.println("SUCCESS: Toolchain correctly detected JDK 17 and set build-packages to openjdk-17-jdk");