diff --git a/pom.xml b/pom.xml index 59c0165..550511c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ under the License. maven-toolchains-plugin - 3.1.1-SNAPSHOT + 3.2.0-SNAPSHOT maven-plugin Apache Maven Toolchains Plugin diff --git a/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java index 7b8ec3e..d8454f6 100644 --- a/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java +++ b/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java @@ -35,8 +35,8 @@ import org.apache.maven.toolchain.ToolchainPrivate; /** - * Check that toolchains requirements are met by currently configured toolchains and - * store the selected toolchains in build context for later retrieval by other plugins. + * Check that toolchains requirements are met by currently configured toolchains in {@code toolchains.xml} and + * store the selected toolchain in build context for later retrieval by other plugins. * * @author mkleint */ @@ -61,10 +61,10 @@ public class ToolchainMojo extends AbstractMojo { /** * Toolchains requirements, specified by one - *
  <toolchain-type>
-     *    <param>expected value</param>
-     *    ...
-     *  </toolchain-type>
+ *
{@code   
+     *     expected value
+     *     ...
+     *   }
* element for each required toolchain. */ @Parameter(required = true) diff --git a/src/main/java/org/apache/maven/plugins/toolchain/jdk/DisplayDiscoveredJdkToolchainsMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/jdk/DisplayDiscoveredJdkToolchainsMojo.java index bf3b46c..fc6a457 100644 --- a/src/main/java/org/apache/maven/plugins/toolchain/jdk/DisplayDiscoveredJdkToolchainsMojo.java +++ b/src/main/java/org/apache/maven/plugins/toolchain/jdk/DisplayDiscoveredJdkToolchainsMojo.java @@ -34,6 +34,8 @@ /** * Discover the JDK toolchains and print them to the console. + * + * @since 3.2.0 */ @Mojo(name = "display-discovered-jdk-toolchains", requiresProject = false) public class DisplayDiscoveredJdkToolchainsMojo extends AbstractMojo { diff --git a/src/main/java/org/apache/maven/plugins/toolchain/jdk/GenerateJdkToolchainsXmlMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/jdk/GenerateJdkToolchainsXmlMojo.java index 450eb95..e4f3e6e 100644 --- a/src/main/java/org/apache/maven/plugins/toolchain/jdk/GenerateJdkToolchainsXmlMojo.java +++ b/src/main/java/org/apache/maven/plugins/toolchain/jdk/GenerateJdkToolchainsXmlMojo.java @@ -36,6 +36,8 @@ /** * Run the JDK toolchain discovery mechanism and generates a toolchains XML. + * + * @since 3.2.0 */ @Mojo(name = "generate-jdk-toolchains-xml", requiresProject = false) public class GenerateJdkToolchainsXmlMojo extends AbstractMojo { diff --git a/src/main/java/org/apache/maven/plugins/toolchain/jdk/SelectJdkToolchainMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/jdk/SelectJdkToolchainMojo.java index 02efff9..c76f80f 100644 --- a/src/main/java/org/apache/maven/plugins/toolchain/jdk/SelectJdkToolchainMojo.java +++ b/src/main/java/org/apache/maven/plugins/toolchain/jdk/SelectJdkToolchainMojo.java @@ -50,6 +50,8 @@ /** * Discover JDK toolchains and select a matching one. + * + * @since 3.2.0 */ @Mojo(name = "select-jdk-toolchain", defaultPhase = LifecyclePhase.VALIDATE) public class SelectJdkToolchainMojo extends AbstractMojo { diff --git a/src/main/java/org/apache/maven/plugins/toolchain/jdk/ToolchainDiscoverer.java b/src/main/java/org/apache/maven/plugins/toolchain/jdk/ToolchainDiscoverer.java index f138565..897e69e 100644 --- a/src/main/java/org/apache/maven/plugins/toolchain/jdk/ToolchainDiscoverer.java +++ b/src/main/java/org/apache/maven/plugins/toolchain/jdk/ToolchainDiscoverer.java @@ -57,7 +57,10 @@ import static org.apache.maven.plugins.toolchain.jdk.SelectJdkToolchainMojo.TOOLCHAIN_TYPE_JDK; /** - * Toolchain discoverer service + * Toolchain discoverer service: tries {@code JAVA{xx}_HOME} environment variables, third party installers and + * OS-specific locations. + * + * @since 3.2.0 */ @Named @Singleton @@ -78,7 +81,7 @@ public class ToolchainDiscoverer { public static final List SORTED_PROVIDES = Collections.unmodifiableList( Arrays.asList(VERSION, RUNTIME_NAME, RUNTIME_VERSION, VENDOR, VENDOR_VERSION, CURRENT, LTS, ENV)); - public static final String DISCOVERED_TOOLCHAINS_CACHE_XML = ".m2/discovered-toolchains-cache.xml"; + public static final String DISCOVERED_TOOLCHAINS_CACHE_XML = ".m2/discovered-jdk-toolchains-cache.xml"; public static final String JDK_HOME = "jdkHome"; public static final String JAVA_HOME = "java.home"; @@ -394,18 +397,27 @@ private Set findJdks() { return foundJdks; } + /** + * Find JDKs in known classical locations. + * + * @return a set of path where JDKs were found. + */ private Set doFindJdks() { List dirsToTest = new ArrayList<>(); + // add current JDK dirsToTest.add(Paths.get(System.getProperty(JAVA_HOME))); + // check environment variables for JAVA{xx}_HOME System.getenv().entrySet().stream() .filter(e -> e.getKey().startsWith("JAVA") && e.getKey().endsWith("_HOME")) .map(e -> Paths.get(e.getValue())) .forEach(dirsToTest::add); + final Path userHome = Paths.get(System.getProperty(USER_HOME)); List installedDirs = new ArrayList<>(); - // jdk installed by third + + // JDK installed by third-party tool managers installedDirs.add(userHome.resolve(".jdks")); installedDirs.add(userHome.resolve(".m2").resolve("jdks")); installedDirs.add(userHome.resolve(".sdkman").resolve("candidates").resolve("java")); @@ -414,7 +426,8 @@ private Set doFindJdks() { installedDirs.add(userHome.resolve(".jbang").resolve("cache").resolve("jdks")); installedDirs.add(userHome.resolve(".asdf").resolve("installs")); installedDirs.add(userHome.resolve(".jabba").resolve("jdk")); - // os related directories + + // OS related directories String osname = System.getProperty("os.name").toLowerCase(Locale.ROOT); boolean macos = osname.startsWith("mac"); boolean win = osname.startsWith("win"); @@ -437,6 +450,7 @@ private Set doFindJdks() { installedDirs.add(Paths.get("/opt/java")); installedDirs.add(Paths.get("/usr/lib/jvm")); } + for (Path dest : installedDirs) { if (Files.isDirectory(dest)) { try (Stream stream = Files.list(dest)) { @@ -451,6 +465,7 @@ private Set doFindJdks() { } } } + // only keep directories that have a javac file return dirsToTest.stream() .filter(ToolchainDiscoverer::hasJavaC) diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm index 6a65a88..e6ba754 100644 --- a/src/site/apt/index.apt.vm +++ b/src/site/apt/index.apt.vm @@ -31,20 +31,21 @@ ${project.name} * Goals Overview - Since version 3.2.0, a new toolchains mechanism is provided. This relies on an automatic discovery mechanism based - on an internal heuristic which tries to detect JDK from known locations. Read about the {{{./toolchains/discovery.html}discovery mechanism}} for more + Since version 3.2.0, a new JDK-specific toolchains mechanism is provided. This relies on an automatic JDK discovery mechanism based + on an internal heuristic which tries to detect JDKs from known locations. Read about the {{{./toolchains/jdk-discovery.html}JDK discovery mechanism}} for more information. This mechanism is to be used with the goal: - * {{{./toolchain-mojo.html}toolchains:select-jdk-toolchain}} discover and selects a matching toolchain. + * {{{./select-jdk-toolchain-mojo.html}toolchains:select-jdk-toolchain}} discover and selects a matching JDK toolchain. - Two helper goals are also provided: + Two associated helper goals are also provided: - * {{{./toolchain-mojo.html}toolchains:display-discovered-jdk-toolchains}} displays discovered toolchains to the console. - * {{{./toolchain-mojo.html}toolchains:generate-jdk-toolchains-xml}} can be used to write a <<>> containing discovered JDKs. + * {{{./display-discovered-jdk-toolchains-mojo.html}toolchains:display-discovered-jdk-toolchains}} displays discovered JDK toolchains to the console, - The previous <<>> goal is still available: + * {{{./generate-jdk-toolchains-xml-mojo.html}toolchains:generate-jdk-toolchains-xml}} can be used to generate discovered JDKs in <<>> format and let user copy/paste. - * {{{./toolchain-mojo.html}toolchains:toolchain}} selects a toolchain based on configured build requirements and stores it in build context for later retrieval by other plugins. + The previous <<>> goal is still available for JDK and {{{./toolchains/custom.html}other types}} of toolchains: + + * {{{./toolchain-mojo.html}toolchains:toolchain}} selects a toolchain from <<>> based on configured build requirements and stores it in build context for later retrieval by other plugins. * Usage diff --git a/src/site/apt/toolchains/discovery.apt.vm b/src/site/apt/toolchains/jdk-discovery.apt.vm similarity index 89% rename from src/site/apt/toolchains/discovery.apt.vm rename to src/site/apt/toolchains/jdk-discovery.apt.vm index e528bc6..692dc9a 100644 --- a/src/site/apt/toolchains/discovery.apt.vm +++ b/src/site/apt/toolchains/jdk-discovery.apt.vm @@ -16,7 +16,7 @@ ~~ under the License. ------ - Discovery mechanism + JDK Discovery mechanism ------ Guillaume Nodet ------ @@ -71,7 +71,7 @@ JDK Toolchain discovery mechanism The <<>> goal finds a matching JDK. The config below allows using the current JDK, or any other discovered JDK >= 17. - The current JDK can be kept for speed, but JDK 17 or higher will be used if the current JDK is older than 17. + The current JDK can be kept for speed, but JDK 17 or higher will be used if the current JDK is older than 17: +---+ @@ -99,6 +99,12 @@ JDK Toolchain discovery mechanism JAVA17_HOME ++---+ + + You can also do everything only at CLI level, without modifying your <<>> + ++---+ +mvn toolchains:select-jdk-toolchain -Dtoolchain.jdk.version="[17,)" compile +---+ * Selection mechanism @@ -135,13 +141,13 @@ JDK Toolchain discovery mechanism The default value is <<>>. -* Toolchains XML file +* <<>> file - The generation of the <<>> file is not necessary to use discovered toolchains. - The <<>> will select a toolchain amongst explicitly configured toolchains and discovered - toolchains. Discovered toolchains are cached in <<<~/.m2/discovered-toolchains-cache.xml>>> file + The generation of the <<>> file is not necessary to use discovered JDK toolchains. + The <<>> will select a toolchain amongst explicitly configured toolchains in <<>> and discovered + JDK toolchains. Discovered JDK toolchains are cached in <<<~/.m2/discovered-jdk-toolchains-cache.xml>>> file by default, to speed up builds. - If you prefer, you can use the <<>> to generate a toolchain XML. This can be used in + If you prefer, you can use the <<>> to generate a <<>>. This can be used in conjunction with the <<>> configuration to disable discovery and only use explicitly configured toolchains. diff --git a/src/site/apt/toolchains/jdk.apt.vm b/src/site/apt/toolchains/jdk.apt.vm index 9b5a824..04f2ac1 100644 --- a/src/site/apt/toolchains/jdk.apt.vm +++ b/src/site/apt/toolchains/jdk.apt.vm @@ -25,7 +25,7 @@ JDK Toolchain -Note that this page refers to hand-written JDK toolchains. For a simpler setup, look at the {{{./discovery.html}discovery mechanism}}. + Note that this page refers to hand-written JDK toolchains in <<<~/.m2/toolchains.xml>>>. For a simpler setup, look at the {{{./jdk-discovery.html}JDK discovery mechanism}}. * Toolchain Description @@ -33,16 +33,16 @@ Note that this page refers to hand-written JDK toolchains. For a simpler setup, Predefined <<<\>>> identification tokens, for requirement matching in plugin configuration, are: - * "<<>>" marks the version of the JDK in <<>>. In plugin's selection, this can be either a single version or a version range. + * "<<>>" marks the version of the JDK in <<>>. In plugin's selection, this can be either a single version or a version range. * Other tokens are accepted, but only exact matches are supported. [] - There is only one <<>> <<<\>>> element named "<<>>". It designates the root directory + In <<>>, there is only one <<<\>>> element named "<<>>". It designates the root directory of a JDK installation. -* Sample <<>> setup +* Sample <<<~/.m2/toolchains.xml>>> setup +---+ diff --git a/src/site/apt/usage.apt.vm b/src/site/apt/usage.apt.vm index c7598b3..276ca2e 100644 --- a/src/site/apt/usage.apt.vm +++ b/src/site/apt/usage.apt.vm @@ -34,7 +34,7 @@ Usage tools (including location and other information). Maven Toolchains Plugin can read which toolchains are available on the user's - computer (as configured in <<>>) and match them against the + computer (as configured in <<<~/.m2/toolchains.xml>>>) and match them against the toolchain requirements of the project (as configured in <<>>). If a match is found, the toolchain is made available to other, , Maven plugins in the build. diff --git a/src/site/site.xml b/src/site/site.xml index 2989a7b..a380eea 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -27,13 +27,13 @@ under the License. - - + + - +