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();