Polecenie Maven do wyświetlenia faz cyklu życia wraz z powiązanymi celami?

104

Po prostu uczę się Mavena, więc może to być oczywiste, ale nie mogę znaleźć łatwego sposobu na wyliczenie celów związanych z każdą fazą cyklu życia mavena dla danego projektu.

Widziałem, że domyślne fazy cyklu życia Mavena i odpowiadające im domyślne cele są tutaj udokumentowane . Jak dotąd rozumiem, że każdy pom.xml może wiązać dodatkowe cele z każdą fazą cyklu życia.

Czy więc istnieje polecenie mvn, aby określić cele, które będą realizowane dla każdej fazy cyklu życia dla danego projektu? Jeśli nie, to chyba po prostu muszę przejrzeć plik pom.xml dla każdego nowego projektu maven, aby to zrozumieć?

Upgradingdave
źródło

Odpowiedzi:

128

mvn help:describe -Dcmd=compile (lub jakakolwiek inna ważna faza)

Akira
źródło
3
Nie widzisz celów związanych z fazami w danych wyjściowych tego polecenia. Zamiast tego widzę wtyczki / fazy.
Dmitry Minkovsky
Może źle zrozumiałem pytanie, ale to polecenie jest „odwrotnym wyszukiwaniem” pytania (zawiera listę wszystkich faz tego celu)? link mówi „Wyświetla listę atrybutów wtyczki Maven i / lub celów (czyli Mojo - zwykły stary obiekt Java Maven)”.
user2039709
132

buildplan-maven-pluginJest doskonałym narzędziem do pokazania w jaki sposób cele są związane z fazami.

Poniżej znajdują się przykłady poleceń, które możesz uruchomić. Polecenia automatycznie pobiorą i zainstalują wtyczkę, jeśli nie została jeszcze zainstalowana.

Wypisz cele według kolejności, w jakiej będą wykonywane

> 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

Grupuj cele według fazy

> 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

Grupuj cele według wtyczki

> 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

Uwagi

Domyślnie cele wyszukują zadania, które zostałyby uruchomione, gdyby został wywołany przez użytkownika mvn deploy. Fazy ​​takie jak cleannie zostaną uwzględnione. Aby uwzględnić wiele faz w wyszukiwaniu, użyj buildplan.taskswłaściwości:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
źródło
33
To powinno być domyślnie wbudowane w Maven.
lanoxx
5
działa również bez regulacji pom:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Ta odpowiedź byłaby idealna, gdyby zaczęła się od komentarza FibreFoX.
UFL1138
Myślę, że ta odpowiedź jest znacznie lepsza niż zaakceptowana odpowiedź.
Panayotis
Zgadzam się z @Ianoxx, że powinno to być domyślnie dodane do Maven. Świetna wtyczka!
Miguel Pardal
18

Jedynym pomocnym narzędziem jest mvn help:effective-pomwydrukowanie POM ze wszystkimi zmiennymi i rozwiniętymi wszystkimi nadrzędnymi POM. Pomaga to zrozumieć, co widzi Maven. Na tej podstawie łatwo jest znaleźć wszystkie dodatkowe cele (których zwykle nie jest wiele).

Większym problemem są niejawne cele (tj. Gdy wtyczka automatycznie podpina się do niektórych faz cyklu życia). Nie ma łatwego sposobu, aby je zobaczyć bez faktycznego uruchomienia Mavena. Powinno to stać się lepsze w Maven 3. Do tego czasu uruchom Mavena, -Xktóry wypisze całą masę danych debugowania plus bieżącą fazę i które wtyczki są wykonywane.

Aaron Digulla
źródło
Dzięki, Aaron, to było pomocne!
Upgradingdave
Jak to się poprawia w Maven 3? Czy to w obecnej alfa-6?
Lars Corneliussen
2
Jason powiedział mi, że nowy Maven 3 zbuduje model całej kompilacji, zanim faktycznie ją uruchomi. Oznacza to, że możesz sprawdzić (i wydrukować) punkty zaczepienia bez uruchamiania poleceń.
Aaron Digulla
skuteczny pom powinien pokazywać rzeczywistą wiążącą fazę każdego celu, który obecnie tego nie robi ... westchnij ..
Junchen Liu
1

Jeśli nie z Mavenem, ale używając m2e, możesz to zrobić za pomocą bloku kodu, którego możesz użyć we wtyczce 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);
                }

Spójrz na pełne źródło .

Już zaimplementowano w:

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

Wykorzystuje zdolność m2e do obliczania powiązania celów z fazami. Próbuję też rozwiązać to na poziomie maven.

Sandip Chitale
źródło
Nie
wysyłaj
1

Umieściłem odpowiedź Chada w skrypcie (więc nie muszę pamiętać nazwy wtyczki, która jest naprawdę długa). Umieść go w swoim ~ / bin / folderze, abyś mógł go używać w dowolnym miejscu.

#!/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
źródło