This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch discovered-toolchains in repository https://gitbox.apache.org/repos/asf/maven-toolchains-plugin.git
commit 93918e25160e3d1988302f3b3b5107a41321c7d8 Author: Guillaume Nodet <[email protected]> AuthorDate: Tue May 30 09:58:02 2023 +0200 JDK Toolchains discovery mojos --- .../toolchain/DisplayDiscoveredToolchainsMojo.java | 62 ++++++++++ .../toolchain/GenerateToolchainsXmlMojo.java | 64 ++++++++++ .../maven/plugins/toolchain/JdkToolchainMojo.java | 132 +++++++++++++++++++++ 3 files changed, 258 insertions(+) diff --git a/src/main/java/org/apache/maven/plugins/toolchain/DisplayDiscoveredToolchainsMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/DisplayDiscoveredToolchainsMojo.java new file mode 100644 index 0000000..db2f5ca --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/toolchain/DisplayDiscoveredToolchainsMojo.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.plugins.toolchain; + +import java.util.List; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.toolchain.model.PersistedToolchains; +import org.apache.maven.toolchain.model.ToolchainModel; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +@Mojo(name = "display-discovered-toolchains", requiresProject = false) +public class DisplayDiscoveredToolchainsMojo extends AbstractMojo { + + @Component + PlexusContainer container; + + @Component + Log log; + + @Override + public void execute() throws MojoFailureException { + try { + Object discoverer = container.lookup("org.apache.maven.toolchain.discovery.ToolchainDiscoverer"); + PersistedToolchains toolchains = (PersistedToolchains) + discoverer.getClass().getMethod("discoverToolchains").invoke(discoverer); + List<ToolchainModel> models = toolchains.getToolchains(); + log.info("Discovered " + models.size() + " JDK toolchains:"); + for (ToolchainModel model : models) { + log.info(" - " + + ((Xpp3Dom) model.getConfiguration()) + .getChild("jdkHome") + .getValue()); + log.info(" provides:"); + model.getProvides().forEach((k, v) -> log.info(" " + k + ": " + v)); + } + } catch (Exception e) { + throw new MojoFailureException("Unable to retrieve discovered toolchains", e); + } + } +} diff --git a/src/main/java/org/apache/maven/plugins/toolchain/GenerateToolchainsXmlMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/GenerateToolchainsXmlMojo.java new file mode 100644 index 0000000..3e73b8d --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/toolchain/GenerateToolchainsXmlMojo.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.plugins.toolchain; + +import java.io.StringWriter; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.toolchain.model.PersistedToolchains; +import org.apache.maven.toolchain.model.io.xpp3.MavenToolchainsXpp3Writer; +import org.codehaus.plexus.PlexusContainer; + +@Mojo(name = "generate-toolchains-xml", requiresProject = false) +public class GenerateToolchainsXmlMojo extends AbstractMojo { + + @Component + PlexusContainer container; + + @Parameter + Path file; + + @Override + public void execute() throws MojoFailureException { + try { + Object discoverer = container.lookup("org.apache.maven.toolchain.discovery.ToolchainDiscoverer"); + PersistedToolchains toolchains = (PersistedToolchains) + discoverer.getClass().getMethod("discoverToolchains").invoke(discoverer); + if (file != null) { + Files.createDirectories(file.getParent()); + try (Writer writer = Files.newBufferedWriter(file)) { + new MavenToolchainsXpp3Writer().write(writer, toolchains); + } + } else { + StringWriter writer = new StringWriter(); + new MavenToolchainsXpp3Writer().write(writer, toolchains); + System.out.println(writer); + } + } catch (Exception e) { + throw new MojoFailureException("Unable to generate toolchains.xml", e); + } + } +} diff --git a/src/main/java/org/apache/maven/plugins/toolchain/JdkToolchainMojo.java b/src/main/java/org/apache/maven/plugins/toolchain/JdkToolchainMojo.java new file mode 100644 index 0000000..37fbf0b --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/toolchain/JdkToolchainMojo.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.plugins.toolchain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.annotations.Component; +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.toolchain.MisconfiguredToolchainException; +import org.apache.maven.toolchain.ToolchainManagerPrivate; +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. + * + * @author mkleint + */ +@Mojo(name = "jdk-toolchain", defaultPhase = LifecyclePhase.VALIDATE) +public class JdkToolchainMojo extends AbstractMojo { + + public enum JdkMode { + /** always ignore the current JDK */ + Ignore, + /** to not use a toolchain if the toolchains that would be selected is the current JDK */ + IfSame, + /** favor the current JDK if it matches the requirements */ + IfMatch + } + + /** + */ + @Component + private ToolchainManagerPrivate toolchainManager; + + /** + * The current build session instance. This is used for toolchain manager API calls. + */ + @Component + private MavenSession session; + + @Component + private Log log; + + @Parameter + private String version; + + @Parameter + private String runtimeName; + + @Parameter + private String runtimeVersion; + + @Parameter + private String vendor; + + @Parameter(property = "toolchain.jdk.mode", defaultValue = "IfMatch") + private JdkMode jdkMode = JdkMode.IfMatch; + + @Override + public void execute() throws MojoFailureException { + if (version == null && runtimeName == null && runtimeVersion == null && vendor == null) { + return; + } + + Map<String, String> requirements = new HashMap<>(); + Optional.ofNullable(version).ifPresent(v -> requirements.put("version", v)); + Optional.ofNullable(runtimeName).ifPresent(v -> requirements.put("runtime.name", v)); + Optional.ofNullable(runtimeVersion).ifPresent(v -> requirements.put("runtime.version", v)); + Optional.ofNullable(vendor).ifPresent(v -> requirements.put("vendor", v)); + + Map<String, String> currentRequirements = new HashMap<>(requirements); + currentRequirements.put("current", "true"); + + if (jdkMode == JdkMode.IfMatch) { + List<ToolchainPrivate> toolchains = getToolchains(currentRequirements); + if (!toolchains.isEmpty()) { + log.info("Not using an external toolchain as the current JDK matches the requirements."); + return; + } + } + List<ToolchainPrivate> toolchains = getToolchains(requirements); + if (toolchains.isEmpty()) { + throw new MojoFailureException("Cannot find matching JDK toolchain definition" + System.lineSeparator() + + "Please make sure you define the required toolchains in your ~/.m2/toolchains.xml file."); + } + ToolchainPrivate toolchain = toolchains.get(0); + if (jdkMode == JdkMode.IfSame && toolchain.matchesRequirements(currentRequirements)) { + log.info("Not using an external toolchain as the current JDK has been selected."); + return; + } + toolchainManager.storeToolchainToBuildContext(toolchain, session); + log.info("Found matching JDK toolchain: " + toolchain); + } + + private List<ToolchainPrivate> getToolchains(Map<String, String> requirements) throws MojoFailureException { + try { + return Stream.of(toolchainManager.getToolchainsForType("jdk", session)) + .filter(tc -> tc.matchesRequirements(requirements)) + .collect(Collectors.toList()); + } catch (MisconfiguredToolchainException e) { + throw new MojoFailureException("Unable to retrieve matching toolchains", e); + } + } +}
