Commande Maven pour répertorier les phases du cycle de vie ainsi que les objectifs liés?

104

J'apprends juste Maven, et cela peut donc être évident, mais je ne trouve pas de moyen simple de répertorier les objectifs associés à chaque phase du cycle de vie maven pour un projet donné.

J'ai vu que les phases du cycle de vie par défaut de Maven et les objectifs par défaut correspondants sont documentés ici . D'après ce que j'ai compris jusqu'à présent, chaque pom.xml peut lier des objectifs supplémentaires à chaque phase du cycle de vie.

Alors, existe-t-il une commande mvn pour déterminer les objectifs qui seront exécutés pour chaque phase du cycle de vie d'un projet donné? Sinon, je suppose que je dois juste regarder dans le pom.xml pour chaque nouveau projet maven pour comprendre cela?

Mise à niveaudave
la source

Réponses:

128

mvn help:describe -Dcmd=compile (ou toute autre phase valide)

Akira
la source
3
Ne pas voir les objectifs liés à des phases dans la sortie de cette commande. Au lieu de cela, je vois des plugins / phases.
Dmitry Minkovsky
Mabye J'ai mal compris la question, mais cette commande est la "recherche inversée" de la question (liste de toutes les phases dans lesquelles se trouve cet objectif)? lien dit "Affiche une liste des attributs pour un plugin Maven et / ou des objectifs (aka Mojo - Maven plain Old Java Object)."
user2039709
131

Le buildplan-maven-pluginest un excellent outil pour montrer comment les objectifs sont liés à des phases.

Vous trouverez ci-dessous des exemples de commandes que vous pouvez exécuter. Les commandes téléchargeront et installeront automatiquement le plugin s'il n'a pas déjà été installé.

Répertorier les objectifs par ordre d'exécution

> 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

Objectifs de groupe par phase

> 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

Regrouper les objectifs par 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

Remarques

Par défaut, les objectifs recherchent les tâches qui s'exécuteraient si l'utilisateur était appelé mvn deploy. Des phases telles que cleanne seront pas incluses. Pour inclure plusieurs phases dans la recherche, utilisez la buildplan.taskspropriété:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
la source
33
Cela devrait vraiment être intégré à Maven par défaut.
lanoxx
5
fonctionne également sans ajuster le pom:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Cette réponse serait parfaite si elle commençait par le commentaire de FibreFoX.
UFL1138
Je pense que cette réponse est bien meilleure que la réponse acceptée.
Panayotis
Je suis d'accord avec @Ianoxx que cela devrait être ajouté à Maven par défaut. Super plug-in!
Miguel Pardal
18

Un outil qui aide est mvn help:effective-pomIl imprimera le POM avec toutes les variables et tous les POM parents développés. Cela aide à comprendre ce que voit Maven. À partir de là, il est assez simple de trouver tous les objectifs supplémentaires (qui ne sont généralement pas si nombreux).

Le plus gros problème, ce sont les objectifs implicites (c'est-à-dire lorsqu'un plugin se connecte automatiquement à certaines phases du cycle de vie). Il n'y a pas de moyen facile de les voir sans exécuter Maven. Cela devrait s'améliorer dans Maven 3. Jusque-là, exécutez Maven avec -Xqui affichera un grand nombre de sorties de débogage plus la phase actuelle et quels plugins sont exécutés.

Aaron Digulla
la source
Merci, Aaron, cela a été utile!
Upgradingdave
Comment cela s'améliore-t-il dans Maven 3? Est-ce dans l'alpha-6 actuel?
Lars Corneliussen
2
Jason m'a dit que le nouveau Maven 3 construira un modèle de l'ensemble de la construction avant de le démarrer. Cela signifie que vous pouvez examiner (et imprimer) les hooks sans exécuter les commandes.
Aaron Digulla
le pom efficace devrait montrer la phase de liaison réelle de chaque objectif qui ne fait actuellement pas cela ... soupir ..
Junchen Liu
1

Sinon avec Maven mais en utilisant m2e, vous pouvez le faire en utilisant le bloc de code que vous pouvez utiliser dans un plugin Eclipse:


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

Regardez la source complète .

Déjà implémenté en:

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

Il utilise la capacité de m2e à calculer l'association d'objectifs avec des phases. J'essaye également de le résoudre au niveau maven.

Sandip Chitale
la source
S'il vous plaît ne pas poster de lien seulement des réponses
Bish
1

J'ai mis la réponse de Chad dans un script (donc je n'ai pas à me souvenir du nom du plugin qui est vraiment long). Mettez-le dans votre dossier ~ / bin / pour pouvoir l'utiliser n'importe où.

#!/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
la source