¿Maven comando para enumerar las fases del ciclo de vida junto con los objetivos vinculados?

104

Estoy aprendiendo Maven, por lo que esto puede ser obvio, pero no puedo encontrar una manera fácil de enumerar los objetivos asociados para cada fase del ciclo de vida de Maven para un proyecto determinado.

Vi que las fases del ciclo de vida predeterminado de Maven y los objetivos predeterminados correspondientes están documentados aquí . Hasta ahora tengo entendido que cada pom.xml puede vincular objetivos adicionales a cada fase del ciclo de vida.

Entonces, ¿existe un comando mvn para determinar los objetivos que se ejecutarán para cada fase del ciclo de vida de un proyecto determinado? Si no es así, supongo que solo tengo que revisar el pom.xml de cada nuevo proyecto de maven para resolver esto.

Upgradingdave
fuente

Respuestas:

128

mvn help:describe -Dcmd=compile (o cualquier otra fase válida)

Akira
fuente
3
No ver objetivos vinculados a fases en la salida de este comando. En cambio, veo complementos / fases.
Dmitry Minkovsky
Mabye, entendí mal la pregunta, pero este comando es la "búsqueda inversa" de la pregunta (Lista de todas las fases en las que se encuentra este objetivo). enlace dice "Muestra una lista de los atributos para un complemento de Maven y / o objetivos (también conocido como Mojo - Maven simple objeto Java antiguo)".
user2039709
131

El buildplan-maven-plugines una excelente herramienta para mostrar cómo los objetivos están ligados a las fases.

A continuación se muestran ejemplos de comandos que puede ejecutar. Los comandos descargarán e instalarán automáticamente el complemento si aún no se ha instalado.

Enumere los objetivos según el orden en que se ejecutarán

> 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

Objetivos de grupo por fase

> 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

Objetivos de grupo por complemento

> 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

Notas

De forma predeterminada, los objetivos buscan tareas que se ejecutarían si el usuario las invocara mvn deploy. Fases como cleanno se incluirán. Para incluir varias fases en la búsqueda, use la buildplan.taskspropiedad:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
fuente
33
Esto realmente debería estar integrado en Maven de forma predeterminada.
lanoxx
5
también funciona sin ajustar el pom:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Esta respuesta sería perfecta si comenzara con el comentario de FibreFoX.
UFL1138
Creo que esta respuesta es mucho mejor que la respuesta aceptada.
Panayotis
Estoy de acuerdo con @Ianoxx en que esto debería agregarse a Maven de forma predeterminada. ¡Gran complemento!
Miguel Pardal
18

Una herramienta que ayuda es mvn help:effective-pomque imprimirá el POM con todas las variables y todos los POM principales expandidos. Esto ayuda a comprender lo que ve Maven. A partir de ahí, es bastante sencillo encontrar todos los objetivos adicionales (que normalmente no son tantos).

El mayor problema son los objetivos implícitos (es decir, cuando un complemento se engancha automáticamente a algunas fases del ciclo de vida). No hay una manera fácil de verlos sin ejecutar Maven. Esto debería mejorar en Maven 3. Hasta entonces, ejecute Maven con el -Xque imprimirá una gran cantidad de resultados de depuración más la fase actual y los complementos que se ejecutan.

Aaron Digulla
fuente
¡Gracias, Aaron, esto fue útil!
Actualización el
¿Cómo está mejorando esto en Maven 3? ¿Está en el alpha-6 actual?
Lars Corneliussen
2
Jason me dijo que el nuevo Maven 3 construirá un modelo de toda la construcción antes de iniciarlo. Eso significa que puede examinar (e imprimir) los ganchos sin ejecutar los comandos.
Aaron Digulla
el pom efectivo debe mostrar la fase de unión real de cada gol que actualmente no está haciendo eso ... suspiro ..
Junchen Liu
1

Si no es con Maven pero usando m2e, puede hacerlo usando el bloque de código que puede usar en un complemento de 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);
                }

Mira la fuente completa .

Ya implementado en:

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

Hace uso de la capacidad de m2e para calcular la asociación de metas con fases. También estoy tratando de resolverlo a nivel experto.

Sandip Chitale
fuente
Por favor, no publique enlaces solo respuestas
bish
1

Puse la respuesta de Chad en un script (para no tener que recordar el nombre del complemento, que es muy largo). Ponlo en tu carpeta ~ / bin / para que puedas usarlo en cualquier lugar.

#!/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
fuente