Команда Maven для перечисления этапов жизненного цикла вместе с привязанными целями?

104

Я только изучаю Maven, и это может быть очевидно, но я не могу найти простой способ перечислить цели, связанные с каждой фазой жизненного цикла maven для данного проекта.

Я видел, что здесь задокументированы этапы жизненного цикла Maven по умолчанию и соответствующие цели по умолчанию . На данный момент я понимаю, что каждый pom.xml может связывать дополнительные цели с каждой фазой жизненного цикла.

Итак, существует ли команда mvn для определения целей, которые будут выполняться для каждой фазы жизненного цикла данного проекта? Если нет, я думаю, мне просто нужно просмотреть pom.xml для каждого нового проекта maven, чтобы понять это?

Обновление
источник

Ответы:

128

mvn help:describe -Dcmd=compile (или любой другой действительный этап)

Акира
источник
3
В выводе этой команды не отображаются цели, привязанные к фазам. Вместо этого я вижу плагины / фазы.
Дмитрий Миньковский
Mabye Я неправильно понял вопрос, но эта команда является «обратным поиском» вопроса (перечисление всех этапов, на которых находится эта цель)? ссылка говорит: «Отображает список атрибутов для подключаемого модуля Maven и / или целей (он же Mojo - простой старый объект Java Maven)».
user2039709
132

Это buildplan-maven-pluginотличный инструмент для демонстрации привязки целей к фазам.

Ниже приведены примеры команд, которые вы можете запустить. Команды автоматически загрузят и установят плагин, если он еще не установлен.

Перечислите цели в порядке их выполнения

> 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

Группируйте цели по фазам

> 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

Группируйте цели по плагинам

> 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

Ноты

По умолчанию цели ищут задачи, которые будут запущены при вызове пользователя mvn deploy. Такие фазы, как clean, не будут включены. Чтобы включить в поиск несколько этапов, используйте buildplan.tasksсвойство:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Чад Нуи
источник
33
Это действительно должно быть встроено в Maven по умолчанию.
lanoxx
5
также работает без настройки mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
помпов
1
Этот ответ был бы идеальным, если бы он начинался с комментария FibreFoX.
UFL1138, 07
Я думаю, что этот ответ намного лучше принятого.
Панайотис
Я согласен с @Ianoxx, что это должно быть добавлено в Maven по умолчанию. Отличный плагин!
Miguel Pardal
18

Один из инструментов, который помогает, - mvn help:effective-pomэто распечатать POM со всеми переменными и всеми родительскими POM. Это помогает понять, что видит Maven. Отсюда довольно просто найти все дополнительные цели (которых обычно не так много).

Более серьезная проблема - это неявные цели (т.е. когда плагин автоматически подключается к некоторым фазам жизненного цикла). Нет простого способа увидеть их, не запустив Maven. В Maven 3 это должно стать лучше. А пока запустите Maven, с -Xкоторым будет печататься много отладочной информации, плюс текущая фаза и какие плагины выполняются.

Аарон Дигулла
источник
Спасибо, Аарон, это было полезно!
Upgradingdave
Как это улучшается в Maven 3? Это в нынешней альфа-6?
Lars Corneliussen
2
Джейсон сказал мне, что новый Maven 3 построит модель всей сборки перед ее запуском. Это означает, что вы можете исследовать (и распечатать) перехватчики без выполнения команд.
Аарон Дигулла
эффективный помп должен показывать фактическую фазу привязки каждой цели, которая в настоящее время этого не делает ... вздох ...
Лю
1

Если не с Maven, но с m2e, вы можете сделать это с помощью блока кода, который вы можете использовать в плагине 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);
                }

Посмотрите полный исходный код .

Уже реализовано в:

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

Он использует способность m2e вычислять связь целей с фазами. Я также пытаюсь решить это на уровне maven.

Сандип Читале
источник
Пожалуйста, не
размещайте
1

Я поместил ответ Чада в сценарий (так что мне не нужно запоминать имя плагина, которое действительно длинное). Поместите его в свою папку ~ / bin /, чтобы вы могли использовать его где угодно.

#!/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;
Крейг
источник