Maven-Befehl zum Auflisten von Lebenszyklusphasen zusammen mit gebundenen Zielen?

104

Ich lerne gerade Maven, und das mag offensichtlich sein, aber ich kann keinen einfachen Weg finden, die Ziele aufzulisten, die für jede Maven-Lebenszyklusphase für ein bestimmtes Projekt verbunden sind.

Ich habe gesehen, dass die Maven-Standardlebenszyklusphasen und die entsprechenden Standardziele hier dokumentiert sind . Mein bisheriges Verständnis ist, dass jede pom.xml zusätzliche Ziele an jede Lebenszyklusphase binden kann.

Gibt es also einen mvn-Befehl, um die Ziele zu bestimmen, die für jede Lebenszyklusphase eines bestimmten Projekts ausgeführt werden? Wenn nicht, muss ich wohl nur die pom.xml für jedes neue Maven-Projekt durchsehen, um das herauszufinden?

Upgradingdave
quelle

Antworten:

128

mvn help:describe -Dcmd=compile (oder eine andere gültige Phase)

Akira
quelle
3
In der Ausgabe dieses Befehls werden keine an Phasen gebundenen Ziele angezeigt. Stattdessen sehe ich Plugins / Phasen.
Dmitry Minkovsky
Mabye, ich habe die Frage falsch verstanden, aber dieser Befehl ist die "umgekehrte Suche" zu der Frage (Auflistung aller Phasen, in denen sich dieses Ziel befindet)? Der Link lautet "Zeigt eine Liste der Attribute für ein Maven-Plugin und / oder Ziele an (auch bekannt als Mojo - Maven-einfaches altes Java-Objekt)."
user2039709
131

Das buildplan-maven-pluginist ein hervorragendes Werkzeug, um zu zeigen, wie Ziele an Phasen gebunden sind.

Unten finden Sie Beispiele für Befehle, die Sie ausführen können. Die Befehle laden das Plugin automatisch herunter und installieren es, falls es noch nicht installiert wurde.

Listen Sie die Ziele in der Reihenfolge auf, in der sie ausgeführt werden

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list

PLUGIN                  | PHASE                  | ID                    | GOAL
--------------------------------------------------------------------------------------------
maven-enforcer-plugin   | validate               | default               | enforce
maven-dependency-plugin | process-sources        | default               | copy-dependencies
maven-resources-plugin  | process-resources      | default-resources     | resources
maven-compiler-plugin   | compile                | default-compile       | compile
maven-resources-plugin  | process-test-resources | default-testResources | testResources
maven-compiler-plugin   | test-compile           | default-testCompile   | testCompile
maven-surefire-plugin   | test                   | default-test          | test
maven-jar-plugin        | package                | default-jar           | jar
maven-assembly-plugin   | package                | make-assembly         | single
maven-install-plugin    | install                | default-install       | install
maven-deploy-plugin     | deploy                 | default-deploy        | deploy

Gruppenziele nach Phasen

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list-phase

validate -----------------------------------------------------------------
    + maven-enforcer-plugin   | default               | enforce
process-sources ----------------------------------------------------------
    + maven-dependency-plugin | default               | copy-dependencies
process-resources --------------------------------------------------------
    + maven-resources-plugin  | default-resources     | resources
compile ------------------------------------------------------------------
    + maven-compiler-plugin   | default-compile       | compile
process-test-resources ---------------------------------------------------
    + maven-resources-plugin  | default-testResources | testResources
test-compile -------------------------------------------------------------
    + maven-compiler-plugin   | default-testCompile   | testCompile
test ---------------------------------------------------------------------
    + maven-surefire-plugin   | default-test          | test
package ------------------------------------------------------------------
    + maven-jar-plugin        | default-jar           | jar
    + maven-assembly-plugin   | make-assembly         | single
install ------------------------------------------------------------------
    + maven-install-plugin    | default-install       | install
deploy -------------------------------------------------------------------
    + maven-deploy-plugin     | default-deploy        | deploy

Gruppenziele per Plugin

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list-plugin

maven-enforcer-plugin ---------------------------------------------------
    + validate               | default               | enforce
maven-dependency-plugin -------------------------------------------------
    + process-sources        | default               | copy-dependencies
maven-resources-plugin --------------------------------------------------
    + process-resources      | default-resources     | resources
    + process-test-resources | default-testResources | testResources
maven-compiler-plugin ---------------------------------------------------
    + compile                | default-compile       | compile
    + test-compile           | default-testCompile   | testCompile
maven-surefire-plugin ---------------------------------------------------
    + test                   | default-test          | test
maven-jar-plugin --------------------------------------------------------
    + package                | default-jar           | jar
maven-assembly-plugin ---------------------------------------------------
    + package                | make-assembly         | single
maven-install-plugin ----------------------------------------------------
    + install                | default-install       | install
maven-deploy-plugin -----------------------------------------------------
    + deploy                 | default-deploy        | deploy

Anmerkungen

Standardmäßig suchen die Ziele nach Aufgaben, die ausgeführt werden, wenn der Benutzer sie aufruft mvn deploy. Phasen wie cleanwerden nicht berücksichtigt. Verwenden Sie die buildplan.tasksEigenschaft, um mehrere Phasen in die Suche einzubeziehen:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
quelle
33
Dies sollte standardmäßig in Maven integriert sein.
Lanoxx
5
funktioniert auch ohne den pom einzustellen:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Diese Antwort wäre perfekt, wenn sie mit dem Kommentar von FibreFoX beginnen würde.
UFL1138
Ich denke, diese Antwort ist viel besser als die akzeptierte Antwort.
Panayotis
Ich stimme @Ianoxx zu, dass dies standardmäßig zu Maven hinzugefügt werden sollte. Tolles Plug-In!
Miguel Pardal
18

Ein hilfreiches Tool ist mvn help:effective-pomdas Drucken des POM mit allen Variablen und allen erweiterten übergeordneten POMs. Dies hilft zu verstehen, was Maven sieht. Daraus ist es ziemlich einfach, alle zusätzlichen Ziele zu finden (die normalerweise nicht so viele sind).

Das größere Problem sind die impliziten Ziele (dh wenn sich ein Plugin automatisch an einige Phasen des Lebenszyklus anschließt). Es gibt keine einfache Möglichkeit, diese zu sehen, ohne Maven tatsächlich auszuführen. Dies sollte in Maven 3 besser werden. Führen Sie bis dahin Maven aus, mit -Xdem eine ganze Menge Debug-Ausgaben plus der aktuellen Phase gedruckt werden und welche Plugins ausgeführt werden.

Aaron Digulla
quelle
Danke, Aaron, das war hilfreich!
Upgradedave
Wie wird das in Maven 3 besser? Ist es im aktuellen Alpha-6?
Lars Corneliussen
2
Jason sagte mir, dass der neue Maven 3 ein Modell des gesamten Builds erstellen wird, bevor er tatsächlich gestartet wird. Das bedeutet, dass Sie die Hooks untersuchen (und drucken) können, ohne die Befehle auszuführen.
Aaron Digulla
Der effektive Pom sollte die tatsächliche Bindungsphase jedes Ziels
anzeigen,
1

Wenn nicht mit Maven, sondern mit m2e, können Sie dies mit dem Codeblock tun, den Sie in einem Eclipse-Plugin verwenden können:


final IMavenProjectRegistry projectRegistry = MavenPlugin.getMavenProjectRegistry();
    final IMavenProjectFacade facade = projectRegistry.getProject(project);
    projectRegistry.execute(facade, new ICallable<Void>() {
        public Void call(IMavenExecutionContext context, IProgressMonitor monitor) throws CoreException {
            MavenProject mavenProject = facade.getMavenProject(monitor);
            List<MojoExecution> mojoExecutions = ((MavenProjectFacade) facade).getMojoExecutions(monitor);
            LifecycleMappingResult mappingResult = LifecycleMappingFactory.calculateLifecycleMapping(
                    mavenProject, mojoExecutions, facade.getResolverConfiguration().getLifecycleMappingId(),
                    monitor);
            Map<MojoExecutionKey, List<IPluginExecutionMetadata>> mojoExecutionMapping = mappingResult
                    .getMojoExecutionMapping();

            Map<String, List<MojoExecutionKey>> phases = new LinkedHashMap<String, List<MojoExecutionKey>>();
            for (MojoExecutionKey execution : mojoExecutionMapping.keySet()) {
                List<MojoExecutionKey> executions = phases.get(execution.getLifecyclePhase());
                if (executions == null) {
                    executions = new ArrayList<MojoExecutionKey>();
                    phases.put(execution.getLifecyclePhase(), executions);

                    }
                    executions.add(execution);
                }

Schauen Sie sich die vollständige Quelle an .

Bereits implementiert in:

http://marketplace.eclipse.org/content/phases-and-goals

Es nutzt die Fähigkeit von m2e, die Zuordnung von Zielen zu Phasen zu berechnen. Ich versuche es auch auf Maven-Ebene zu lösen.

Sandip Chitale
quelle
Bitte posten Sie nicht nur Link Antworten
Bish
1

Ich habe die Antwort von Chad in ein Skript eingefügt (damit ich mich nicht an den Namen des Plugins erinnern muss, der wirklich lang ist). Legen Sie es in Ihrem Ordner ~ / bin / ab, damit Sie es überall verwenden können.

#!/usr/bin/env bash
# Created based on https://stackoverflow.com/a/35610377/529256
debug=false

goal='list-phase'
build_plan='clean,deploy'
working_directories=""

for (( i=1; i<=$#; i++ )) do
    case ${!i} in

        -h|--help)
            programName=$( basename ${0} )
            echo "Lists the goals of mvn project(s) by phase in a table";
            echo
            echo "Usage:";
            echo "    ${programName} -d|--debug -g|--goal goal -b|--build_plan build_plan [*directory]";
            echo
            echo "           --goal  The goal for the buildplan-maven-plugin (default: $goal)"
            echo "                   (possible values: list, list-plugin, list-phase)"
            echo
            echo "     --build_plan  The value of the buildplan.tasks parameter (default: $build_plan)"
            echo "                   (examples: 'clean,install', 'deploy', 'install', etc...) "
            echo
            echo "     [*directory]  The directories (with pom.xml files) to run the command in"
            exit 0;
            ;;
        -d|--debug)
            debug=true;
            echo "debug = ${debug}";
            ;;
        -b|--build_plan)
            ((i++))
            build_plan="${!i}"
            ;;
        -g|--goal)
            ((i++))
            goal="${!i}"
            ;;
        *)
            working_directory="${!i}";
            if [ ! -e "${working_directory}" ]; then
                echo "'${working_directory}' doesn't exist";
                exit 1;
            fi;
            if [ -z "${working_directories}" ]; then
                working_directories="$working_directory"
            else
                working_directories="$working_directories ${!i}"
            fi;
            ;;
    esac;
done;

if [ -z "${working_directories}" ]; then
    working_directories="$PWD"
fi

if [ ${debug} = true ]; then
    echo "working_directories=$working_directories"
    echo "goal=$goal"
    echo "build_plan=$build_plan"
fi

for workingDirectory in ${working_directories}; do
    pushd ${workingDirectory} > /dev/null
    echo "cd $workingDirectory"
    echo "mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:${goal} -Dbuildplan.tasks=${build_plan}"
    mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:${goal} -Dbuildplan.tasks=${build_plan}
    popd > /dev/null
done;
Craig
quelle