Comando Maven para listar as fases do ciclo de vida junto com os objetivos vinculados?

104

Estou apenas aprendendo o Maven e isso pode ser óbvio, mas não consigo encontrar uma maneira fácil de listar os objetivos associados a cada fase do ciclo de vida do maven para um determinado projeto.

Eu vi que as fases do ciclo de vida padrão do Maven e os objetivos padrão correspondentes estão documentados aqui . Meu entendimento até agora é que cada pom.xml pode vincular objetivos adicionais a cada fase do ciclo de vida.

Portanto, existe um comando mvn para determinar as metas que serão executadas para cada fase do ciclo de vida de um determinado projeto? Se não, acho que só preciso olhar em pom.xml para cada novo projeto do maven para descobrir isso.

Upgradingdave
fonte

Respostas:

128

mvn help:describe -Dcmd=compile (ou qualquer outra fase válida)

Akira
fonte
3
Não ver metas vinculadas a fases na saída desse comando. Em vez disso, estou vendo plug-ins / fases.
Dmitry Minkovsky
Mabye, entendi a pergunta errado, mas este comando é a "pesquisa reversa" para a pergunta (listando todas as fases em que este objetivo está)? o link diz "Exibe uma lista dos atributos para um plug-in Maven e / ou objetivos (também conhecido como Mojo - Objeto Java antigo simples do Maven)."
user2039709
131

O buildplan-maven-pluginé uma excelente ferramenta para mostrar como os objetivos estão vinculados a fases.

Abaixo estão exemplos de comandos que você pode executar. Os comandos baixarão e instalarão automaticamente o plugin, caso ainda não tenha sido instalado.

Liste as metas pela ordem em que serão executadas

> 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

Gols 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

Metas de grupo por 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

Notas

Por padrão, os objetivos procuram tarefas que seriam executadas se o usuário chamasse mvn deploy. Fases como cleannão serão incluídas. Para incluir várias fases na pesquisa, use a buildplan.taskspropriedade:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
fonte
33
Isso realmente deve ser integrado ao Maven por padrão.
lanoxx
5
também funciona sem ajustar o pom:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Essa resposta seria perfeita se começasse com o comentário do FibreFoX.
UFL1138
Acho que essa resposta é muito melhor do que a resposta aceita.
Panayotis
Concordo com @Ianoxx que isso deve ser adicionado ao Maven por padrão. Ótimo plug-in!
Miguel Pardal
18

Uma ferramenta que ajuda é mvn help:effective-pomimprimir o POM com todas as variáveis ​​e todos os POMs pai expandidos. Isso ajuda a entender o que Maven vê. A partir daí, é muito simples encontrar todos os objetivos adicionais (que geralmente não são tantos).

O maior problema são os objetivos implícitos (ou seja, quando um plugin se conecta a algumas fases do ciclo de vida automaticamente). Não há uma maneira fácil de ver isso sem realmente executar o Maven. Isso deve ficar melhor no Maven 3. Até então, execute o Maven com o -Xqual imprimirá uma grande quantidade de saída de depuração mais a fase atual e quais plug-ins são executados.

Aaron Digulla
fonte
Obrigado, Aaron, isso foi útil!
Upgradingdave de
Como isso está melhorando no Maven 3? Está no atual alfa-6?
Lars Corneliussen,
2
Jason me disse que o novo Maven 3 construirá um modelo de toda a construção antes de realmente iniciá-lo. Isso significa que você pode examinar (e imprimir) os ganchos sem executar os comandos.
Aaron Digulla de
o pom efetivo deve mostrar a fase de ligação real de cada gol que atualmente não está fazendo isso ... suspiro ..
Junchen Liu
1

Se não for com o Maven, mas usando m2e, você pode fazer isso usando o bloco de código que pode ser usado em um plug-in do 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);
                }

Veja a fonte completa .

Já implementado em:

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

Ele faz uso da capacidade de m2e para calcular a associação de metas com fases. Também estou tentando resolver isso no nível de maven.

Sandip Chitale
fonte
Por favor, não poste apenas respostas com links
bish
1

Coloquei a resposta de Chad em um script (para não ter que lembrar o nome do plugin, que é muito longo). Coloque-o na pasta ~ / bin / para que você possa usá-lo em qualquer 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
fonte