From b044bbeee3211ce21545530dd7d91b5662787104 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 18 Jun 2026 19:57:24 +0200 Subject: [PATCH 1/4] Add more goals to help plugin, making it more useful. Example output with (just for example sake) Takari Lifecycle added to POM as extension. The goals show the "real state". https://gist.github.com/cstamas/d466b0df2c63a448109aea4d673db8b5 --- pom.xml | 8 ++ .../help/DescribeDependencyTypeMojo.java | 106 ++++++++++++++++++ .../help/DescribeLifecyclePhaseMojo.java | 82 ++++++++++++++ .../plugins/help/DescribePackagingMojo.java | 103 +++++++++++++++++ 4 files changed, 299 insertions(+) create mode 100644 src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java create mode 100644 src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java create mode 100644 src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java diff --git a/pom.xml b/pom.xml index a5861f4..692f56a 100644 --- a/pom.xml +++ b/pom.xml @@ -266,6 +266,14 @@ + + + io.takari.maven.plugins + takari-lifecycle-plugin + 2.3.4 + true + + diff --git a/src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java b/src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java new file mode 100644 index 0000000..94b0437 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java @@ -0,0 +1,106 @@ +/* + * 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.help; + +import javax.inject.Inject; + +import java.io.IOException; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.maven.artifact.handler.ArtifactHandler; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.project.ProjectBuilder; +import org.eclipse.aether.RepositorySystem; + +/** + * Displays a list of artifact handlers that are defined in Maven. + * + * @since 3.5.2 + */ +@Mojo(name = "describe-dependency-type", requiresProject = false, aggregator = true) +public class DescribeDependencyTypeMojo extends AbstractHelpMojo { + /** + * The default indent size when writing description's Mojo. + */ + private static final int INDENT_SIZE = 2; + + /** + * The Maven default built-in lifecycles. + */ + private final Map artifactHandlers; + + @Inject + public DescribeDependencyTypeMojo( + ProjectBuilder projectBuilder, + RepositorySystem repositorySystem, + Map artifactHandlers) { + super(projectBuilder, repositorySystem); + this.artifactHandlers = artifactHandlers; + } + + // ---------------------------------------------------------------------- + // Mojo parameters + // ---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- + // Public methods + // ---------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + try { + StringBuilder descriptionBuffer = new StringBuilder(); + for (Map.Entry handlerEntry : new TreeMap<>(artifactHandlers).entrySet()) { + if ("default".equals(handlerEntry.getKey())) { + continue; + } + descriptionBuffer.append(handlerEntry.getKey()).append(LS); + ArtifactHandler handler = handlerEntry.getValue(); + descriptionBuffer + .append(" - Extension: ") + .append("*.") + .append(handler.getExtension()) + .append(LS); + if (handler.getClassifier() != null && !handler.getClassifier().isEmpty()) { + descriptionBuffer + .append(" - Classifier: ") + .append(handler.getClassifier()) + .append(LS); + } + if (handler.isAddedToClasspath()) { + descriptionBuffer.append(" - Added to Classpath").append(LS); + } + if (handler.isIncludesDependencies()) { + descriptionBuffer.append(" - Includes dependencies").append(LS); + } + descriptionBuffer.append(LS); + } + getLog().info(LS + "Maven Dependency Types defined:" + LS + LS + descriptionBuffer); + writeFile(output, descriptionBuffer); + } catch (IOException e) { + throw new MojoFailureException(e); + } + } +} diff --git a/src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java b/src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java new file mode 100644 index 0000000..22b1bf6 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java @@ -0,0 +1,82 @@ +/* + * 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.help; + +import javax.inject.Inject; + +import java.io.IOException; +import java.util.List; + +import org.apache.maven.lifecycle.DefaultLifecycles; +import org.apache.maven.lifecycle.Lifecycle; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.project.ProjectBuilder; +import org.eclipse.aether.RepositorySystem; + +/** + * Displays a list of lifecycle phases that are defined in Maven. + * + * @since 3.5.2 + */ +@Mojo(name = "describe-lifecycle-phase", requiresProject = false, aggregator = true) +public class DescribeLifecyclePhaseMojo extends AbstractHelpMojo { + /** + * The Maven default built-in lifecycles. + */ + private final DefaultLifecycles defaultLifecycles; + + @Inject + public DescribeLifecyclePhaseMojo( + ProjectBuilder projectBuilder, RepositorySystem repositorySystem, DefaultLifecycles defaultLifecycles) { + super(projectBuilder, repositorySystem); + this.defaultLifecycles = defaultLifecycles; + } + + // ---------------------------------------------------------------------- + // Mojo parameters + // ---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- + // Public methods + // ---------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + try { + StringBuilder descriptionBuffer = new StringBuilder(); + List lifecycles = defaultLifecycles.getLifeCycles(); + for (Lifecycle lifecycle : lifecycles) { + descriptionBuffer.append(lifecycle.getId()).append(LS); + lifecycle + .getPhases() + .forEach(p -> descriptionBuffer.append(" * ").append(p).append(LS)); + descriptionBuffer.append(LS); + } + getLog().info(LS + "Maven lifecycles defined:" + LS + LS + descriptionBuffer); + writeFile(output, descriptionBuffer); + } catch (IOException e) { + throw new MojoFailureException(e); + } + } +} diff --git a/src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java b/src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java new file mode 100644 index 0000000..cd20817 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java @@ -0,0 +1,103 @@ +/* + * 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.help; + +import javax.inject.Inject; + +import java.io.IOException; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.maven.lifecycle.mapping.Lifecycle; +import org.apache.maven.lifecycle.mapping.LifecycleMapping; +import org.apache.maven.lifecycle.mapping.LifecycleMojo; +import org.apache.maven.lifecycle.mapping.LifecyclePhase; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.project.ProjectBuilder; +import org.eclipse.aether.RepositorySystem; + +/** + * Displays a list of packaging that are defined in Maven. + * + * @since 3.5.2 + */ +@Mojo(name = "describe-packaging", requiresProject = false, aggregator = true) +public class DescribePackagingMojo extends AbstractHelpMojo { + /** + * The Maven default built-in lifecycles. + */ + private final Map lifecycleMapping; + + @Inject + public DescribePackagingMojo( + ProjectBuilder projectBuilder, + RepositorySystem repositorySystem, + Map lifecycleMapping) { + super(projectBuilder, repositorySystem); + this.lifecycleMapping = lifecycleMapping; + } + + // ---------------------------------------------------------------------- + // Mojo parameters + // ---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- + // Public methods + // ---------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + try { + StringBuilder descriptionBuffer = new StringBuilder(); + for (Map.Entry mappingEntry : new TreeMap<>(lifecycleMapping).entrySet()) { + LifecycleMapping mapping = mappingEntry.getValue(); + for (Map.Entry phaseEntry : + mapping.getLifecycles().entrySet()) { + Lifecycle lifecycle = phaseEntry.getValue(); + descriptionBuffer + .append(mappingEntry.getKey()) + .append(" (lifecycle: ") + .append(lifecycle.getId()) + .append(")") + .append(LS); + for (Map.Entry phaseE : + lifecycle.getLifecyclePhases().entrySet()) { + descriptionBuffer.append(" - ").append(phaseE.getKey()).append(LS); + for (LifecycleMojo mojo : phaseE.getValue().getMojos()) { + descriptionBuffer + .append(" - ") + .append(mojo.getGoal()) + .append(LS); + } + } + } + descriptionBuffer.append(LS); + } + getLog().info(LS + "Maven packaging defined:" + LS + LS + descriptionBuffer); + writeFile(output, descriptionBuffer); + } catch (IOException e) { + throw new MojoFailureException(e); + } + } +} From 2c29e53a0630a1bbb80326186121675bcadb9aa4 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 18 Jun 2026 19:59:06 +0200 Subject: [PATCH 2/4] Undo this --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index 692f56a..a5861f4 100644 --- a/pom.xml +++ b/pom.xml @@ -266,14 +266,6 @@ - - - io.takari.maven.plugins - takari-lifecycle-plugin - 2.3.4 - true - - From a3c4c5cdf43def985bb3404fec6d737776cef681 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 18 Jun 2026 22:34:30 +0200 Subject: [PATCH 3/4] Rename goals and mojos --- ...encyTypeMojo.java => ListDependencyTypesMojo.java} | 11 +++-------- ...clePhaseMojo.java => ListLifecyclePhasesMojo.java} | 6 +++--- ...cribePackagingMojo.java => ListPackagingMojo.java} | 6 +++--- 3 files changed, 9 insertions(+), 14 deletions(-) rename src/main/java/org/apache/maven/plugins/help/{DescribeDependencyTypeMojo.java => ListDependencyTypesMojo.java} (92%) rename src/main/java/org/apache/maven/plugins/help/{DescribeLifecyclePhaseMojo.java => ListLifecyclePhasesMojo.java} (93%) rename src/main/java/org/apache/maven/plugins/help/{DescribePackagingMojo.java => ListPackagingMojo.java} (95%) diff --git a/src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java b/src/main/java/org/apache/maven/plugins/help/ListDependencyTypesMojo.java similarity index 92% rename from src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java rename to src/main/java/org/apache/maven/plugins/help/ListDependencyTypesMojo.java index 94b0437..468230e 100644 --- a/src/main/java/org/apache/maven/plugins/help/DescribeDependencyTypeMojo.java +++ b/src/main/java/org/apache/maven/plugins/help/ListDependencyTypesMojo.java @@ -36,20 +36,15 @@ * * @since 3.5.2 */ -@Mojo(name = "describe-dependency-type", requiresProject = false, aggregator = true) -public class DescribeDependencyTypeMojo extends AbstractHelpMojo { - /** - * The default indent size when writing description's Mojo. - */ - private static final int INDENT_SIZE = 2; - +@Mojo(name = "list-dependency-types", requiresProject = false, aggregator = true) +public class ListDependencyTypesMojo extends AbstractHelpMojo { /** * The Maven default built-in lifecycles. */ private final Map artifactHandlers; @Inject - public DescribeDependencyTypeMojo( + public ListDependencyTypesMojo( ProjectBuilder projectBuilder, RepositorySystem repositorySystem, Map artifactHandlers) { diff --git a/src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java b/src/main/java/org/apache/maven/plugins/help/ListLifecyclePhasesMojo.java similarity index 93% rename from src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java rename to src/main/java/org/apache/maven/plugins/help/ListLifecyclePhasesMojo.java index 22b1bf6..2e04ae5 100644 --- a/src/main/java/org/apache/maven/plugins/help/DescribeLifecyclePhaseMojo.java +++ b/src/main/java/org/apache/maven/plugins/help/ListLifecyclePhasesMojo.java @@ -36,15 +36,15 @@ * * @since 3.5.2 */ -@Mojo(name = "describe-lifecycle-phase", requiresProject = false, aggregator = true) -public class DescribeLifecyclePhaseMojo extends AbstractHelpMojo { +@Mojo(name = "list-lifecycle-phases", requiresProject = false, aggregator = true) +public class ListLifecyclePhasesMojo extends AbstractHelpMojo { /** * The Maven default built-in lifecycles. */ private final DefaultLifecycles defaultLifecycles; @Inject - public DescribeLifecyclePhaseMojo( + public ListLifecyclePhasesMojo( ProjectBuilder projectBuilder, RepositorySystem repositorySystem, DefaultLifecycles defaultLifecycles) { super(projectBuilder, repositorySystem); this.defaultLifecycles = defaultLifecycles; diff --git a/src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java b/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java similarity index 95% rename from src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java rename to src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java index cd20817..d16440e 100644 --- a/src/main/java/org/apache/maven/plugins/help/DescribePackagingMojo.java +++ b/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java @@ -39,15 +39,15 @@ * * @since 3.5.2 */ -@Mojo(name = "describe-packaging", requiresProject = false, aggregator = true) -public class DescribePackagingMojo extends AbstractHelpMojo { +@Mojo(name = "list-packaging", requiresProject = false, aggregator = true) +public class ListPackagingMojo extends AbstractHelpMojo { /** * The Maven default built-in lifecycles. */ private final Map lifecycleMapping; @Inject - public DescribePackagingMojo( + public ListPackagingMojo( ProjectBuilder projectBuilder, RepositorySystem repositorySystem, Map lifecycleMapping) { From fe0d006e7ad73fcf5aaf0a963ec41aeea8f6f288 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 18 Jun 2026 22:50:10 +0200 Subject: [PATCH 4/4] Fix ordering --- .../maven/plugins/help/ListPackagingMojo.java | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java b/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java index d16440e..bb5259f 100644 --- a/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java +++ b/src/main/java/org/apache/maven/plugins/help/ListPackagingMojo.java @@ -22,8 +22,10 @@ import java.io.IOException; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; +import org.apache.maven.lifecycle.DefaultLifecycles; import org.apache.maven.lifecycle.mapping.Lifecycle; import org.apache.maven.lifecycle.mapping.LifecycleMapping; import org.apache.maven.lifecycle.mapping.LifecycleMojo; @@ -41,6 +43,11 @@ */ @Mojo(name = "list-packaging", requiresProject = false, aggregator = true) public class ListPackagingMojo extends AbstractHelpMojo { + /** + * The Maven default built-in lifecycles. + */ + private final DefaultLifecycles defaultLifecycles; + /** * The Maven default built-in lifecycles. */ @@ -50,8 +57,10 @@ public class ListPackagingMojo extends AbstractHelpMojo { public ListPackagingMojo( ProjectBuilder projectBuilder, RepositorySystem repositorySystem, + DefaultLifecycles defaultLifecycles, Map lifecycleMapping) { super(projectBuilder, repositorySystem); + this.defaultLifecycles = defaultLifecycles; this.lifecycleMapping = lifecycleMapping; } @@ -70,25 +79,29 @@ public ListPackagingMojo( public void execute() throws MojoExecutionException, MojoFailureException { try { StringBuilder descriptionBuffer = new StringBuilder(); - for (Map.Entry mappingEntry : new TreeMap<>(lifecycleMapping).entrySet()) { - LifecycleMapping mapping = mappingEntry.getValue(); + for (Map.Entry lifecycleMappingEntry : + new TreeMap<>(lifecycleMapping).entrySet()) { + LifecycleMapping lifecycleMapping = lifecycleMappingEntry.getValue(); for (Map.Entry phaseEntry : - mapping.getLifecycles().entrySet()) { - Lifecycle lifecycle = phaseEntry.getValue(); + lifecycleMapping.getLifecycles().entrySet()) { + Lifecycle mapping = phaseEntry.getValue(); descriptionBuffer - .append(mappingEntry.getKey()) + .append(lifecycleMappingEntry.getKey()) .append(" (lifecycle: ") - .append(lifecycle.getId()) + .append(mapping.getId()) .append(")") .append(LS); - for (Map.Entry phaseE : - lifecycle.getLifecyclePhases().entrySet()) { - descriptionBuffer.append(" - ").append(phaseE.getKey()).append(LS); - for (LifecycleMojo mojo : phaseE.getValue().getMojos()) { - descriptionBuffer - .append(" - ") - .append(mojo.getGoal()) - .append(LS); + org.apache.maven.lifecycle.Lifecycle lifecycle = getLifecycle(mapping.getId()); + for (String phase : lifecycle.getPhases()) { + LifecyclePhase lphase = mapping.getLifecyclePhases().get(phase); + if (lphase != null) { + descriptionBuffer.append(" - ").append(phase).append(LS); + for (LifecycleMojo mojo : lphase.getMojos()) { + descriptionBuffer + .append(" - ") + .append(mojo.getGoal()) + .append(LS); + } } } } @@ -100,4 +113,11 @@ public void execute() throws MojoExecutionException, MojoFailureException { throw new MojoFailureException(e); } } + + private org.apache.maven.lifecycle.Lifecycle getLifecycle(String name) { + return defaultLifecycles.getLifeCycles().stream() + .filter(l -> Objects.equals(name, l.getId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("No such lifecycle")); + } }