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");
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..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,6 +24,39 @@ public final class Toolchain {
private Toolchain() {
}
+ private static String getToolchainJavacPath(ToolchainManager toolchainManager, MavenSession session) {
+ 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, MavenSession session, Log log) {
+ String where = getToolchainJavacPath(toolchainManager, session);
+ 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().toString(), "bin", "javac");
+
+ if (Files.isExecutable(java9Path)) {
+ return java9Path.toString();
+ } else if (Files.isExecutable(java8Path)) {
+ return java8Path.toString();
+ }
+ 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,31 +67,21 @@ 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, session, log);
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:
- 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();