Perintah Maven untuk membuat daftar fase siklus hidup bersama dengan tujuan terikat?

104

Saya baru saja mempelajari Maven, dan ini mungkin sudah jelas, tetapi saya tidak dapat menemukan cara mudah untuk membuat daftar tujuan yang terkait untuk setiap fase siklus hidup maven untuk proyek tertentu.

Saya melihat bahwa fase siklus hidup default Maven dan tujuan default terkait didokumentasikan di sini . Pemahaman saya sejauh ini adalah bahwa setiap pom.xml dapat mengikat tujuan tambahan ke setiap fase siklus hidup.

Jadi, apakah ada perintah mvn untuk menentukan tujuan yang akan dijalankan untuk setiap fase siklus hidup untuk proyek tertentu? Jika tidak, saya kira saya hanya perlu melihat pom.xml untuk setiap proyek maven baru untuk mencari tahu?

Upgradingdave
sumber

Jawaban:

128

mvn help:describe -Dcmd=compile (atau fase valid lainnya)

Akira
sumber
3
Tidak melihat tujuan yang terikat pada fase dalam output perintah ini. Sebaliknya, saya melihat plugin / fase.
Dmitry Minkovsky
Mabye Saya memahami pertanyaan yang salah, tetapi perintah ini adalah "pencarian terbalik" untuk pertanyaan (Mencantumkan semua fase tujuan ini)? tautan bertuliskan "Menampilkan daftar atribut untuk Plugin Maven dan / atau tujuan (alias Mojo - Maven biasa Objek Java Lama)."
pengguna2039709
131

Ini buildplan-maven-pluginadalah alat yang sangat baik untuk menunjukkan bagaimana tujuan terikat pada fase.

Di bawah ini adalah contoh perintah yang dapat Anda jalankan. Perintah akan secara otomatis mengunduh dan menginstal plugin jika belum diinstal.

Buat daftar tujuan berdasarkan urutan yang akan mereka jalankan

> 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

Gol grup berdasarkan 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

Gol kelompok berdasarkan 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

Catatan

Secara default, tujuan mencari tugas yang akan dijalankan jika pengguna dipanggil mvn deploy. Tahapan seperti cleantidak akan disertakan. Untuk memasukkan beberapa fase dalam pencarian, gunakan buildplan.tasksproperti:

> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Chad Nouis
sumber
33
Ini harus benar-benar dibangun ke dalam Maven secara default.
lanoxx
5
juga bekerja tanpa menyesuaikan pom:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
FibreFoX
1
Jawaban ini akan sempurna jika dimulai dengan komentar FibreFoX.
UFL1138
Saya pikir jawaban ini jauh lebih baik daripada jawaban yang diterima.
Panayotis
Saya setuju dengan @Ianoxx bahwa ini harus ditambahkan ke Maven secara default. Plug-in yang bagus!
Miguel Pardal
18

Salah satu alat yang membantu adalah mvn help:effective-pomIni akan mencetak POM dengan semua variabel dan semua POM induk diperluas. Ini membantu untuk memahami apa yang dilihat Maven. Dari situ, cukup mudah untuk menemukan semua tujuan tambahan (yang biasanya tidak terlalu banyak).

Masalah yang lebih besar adalah tujuan implisit (yaitu ketika sebuah plugin menghubungkan dirinya sendiri ke beberapa fase siklus hidup secara otomatis). Tidak ada cara mudah untuk melihat ini tanpa benar-benar menjalankan Maven. Ini seharusnya menjadi lebih baik di Maven 3. Sampai saat itu, jalankan Maven -Xyang akan mencetak banyak keluaran debug ditambah fase saat ini dan plugin mana yang dijalankan.

Aaron Digulla
sumber
Terima kasih, Aaron, ini sangat membantu!
Upgradingdave
Bagaimana ini menjadi lebih baik di Maven 3? Apakah dalam alpha-6 saat ini?
Lars Corneliussen
2
Jason memberi tahu saya bahwa Maven 3 baru akan membangun model keseluruhan bangunan sebelum benar-benar memulainya. Itu berarti Anda bisa memeriksa (dan mencetak) hook tanpa menjalankan perintah.
Aaron Digulla
pom efektif harus menunjukkan fase pengikatan aktual dari setiap tujuan yang saat ini tidak melakukan itu ... huh ..
Junchen Liu
1

Jika tidak dengan Maven tetapi menggunakan m2e Anda dapat melakukannya menggunakan blok kode yang dapat Anda gunakan di 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);
                }

Lihat sumber lengkapnya .

Sudah diterapkan di:

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

Itu memanfaatkan kemampuan m2e untuk menghitung asosiasi tujuan dengan fase. Saya juga mencoba menyelesaikannya di level maven.

Sandip Chitale
sumber
Tolong jangan posting jawaban link saja
bish
1

Saya memasukkan jawaban Chad ke dalam skrip (jadi saya tidak perlu mengingat nama plugin yang sangat panjang). Letakkan di ~ / bin / folder Anda sehingga Anda dapat menggunakannya di mana saja.

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