Apa tujuan dan fase Maven dan apa perbedaannya?

Jawaban:

251

Sasaran dieksekusi dalam fase yang membantu menentukan urutan tujuan yang akan dieksekusi. Pemahaman terbaik tentang hal ini adalah dengan melihat binding siklus hidup Maven default yang menunjukkan sasaran mana yang dijalankan di mana fase secara default. Sasaran fase kompilasi akan selalu dieksekusi sebelum sasaran fase uji yang akan selalu dieksekusi sebelum sasaran fase paket dan seterusnya.

Bagian dari kebingungan diperburuk oleh fakta bahwa ketika Anda menjalankan pakar Anda dapat menentukan tujuan atau fase. Jika Anda menentukan fase maka maven akan menjalankan semua fase hingga fase yang Anda tentukan secara berurutan (mis. Jika Anda menentukan paket, pertama-tama akan dijalankan melalui fase kompilasi dan kemudian fase uji dan akhirnya fase paket) dan untuk setiap fase akan jalankan semua tujuan yang melekat pada fase itu.

Ketika Anda membuat eksekusi plugin di file build Maven Anda dan Anda hanya menentukan tujuan, maka itu akan mengikat tujuan itu ke fase default yang diberikan. Misalnya, tujuan jaxb: xjc mengikat secara default ke fase menghasilkan-sumber daya. Namun, ketika Anda menentukan eksekusi, Anda juga dapat secara eksplisit menentukan fase untuk tujuan itu.

Jika Anda menentukan tujuan ketika Anda menjalankan Maven maka itu akan menjalankan tujuan itu dan hanya tujuan itu. Dengan kata lain, jika Anda menentukan toples: toples jar hanya akan menjalankan toples: toples tujuan untuk mengemas kode Anda ke dalam toples. Jika sebelumnya Anda belum menjalankan tujuan kompilasi atau menyiapkan kode kompilasi Anda dengan cara lain, ini kemungkinan besar akan gagal.

Kecepatan
sumber
11
Saya sudah terbiasa mengatakan "Maven melewati semua fase (hingga dan termasuk yang diberikan)" alih-alih "berlari" atau "mengeksekusi" (yang terakhir disebut dalam Pengantar Maven untuk Membangun Siklus Hidup ). Seperti membedakannya dari kode tujuan yang benar-benar dieksekusi. Tapi itu mungkin selera pribadi.
GeroldBroser mengembalikan Monica
Tapi kita juga bisa menjalankan tujuan yang bukan milik fase apa pun, yaitu mvn archetype:generate, dan dalam hal ini pakar hanya mengeksekusi tujuan?
Quazi Irfan
1
@Pace Apakah Anda punya referensi untuk paragraf terakhir? Saya sudah meragukan itu dan mencobanya dengan proyek sederhana di sini: mvn testmenjalankan:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:testsementara mvn compiler:testCompilehanya berjalan --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser mengembalikan Monica
4
@Pace mvn clean compiler:testCompilerun --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileyang gagal dengan Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase(di mana MvnPhasekelas yang diuji direferensikan dalam kelas tes). Rupanya fase tidak dipanggil jika suatu tujuan dipanggil secara eksplisit.
GeroldBroser mengembalikan Monica
1
Berdasarkan masukan dari geroldbroser dan @ kekko12 saya telah memperbarui paragraf terakhir untuk menyatakan bahwa, ketika suatu tujuan ditentukan, hanya tujuan itu yang dijalankan, dan tidak semua fase sebelumnya.
Laju
188

Siklus hidup adalah urutan fase bernama .
Fase dieksekusi secara berurutan. Menjalankan fase berarti mengeksekusi semua fase sebelumnya.

Plugin adalah kumpulan tujuan yang juga disebut MOJO ( M aven O ld J ava O bject).
Analogi: Plugin adalah kelas dan tujuan adalah metode di dalam kelas.

Maven berbasis di sekitar konsep sentral dari Build Life Cycles . Di dalam masing-masing Build Life Cycles ada Build Fase , dan di dalam setiap Build Fase ada Build Goals .

Kita dapat menjalankan fase pembangunan atau membangun tujuan. Saat menjalankan fase pembangunan, kami mengeksekusi semua tujuan pembangunan dalam fase pembangunan tersebut. Bangun sasaran ditugaskan ke satu atau beberapa fase pembangunan. Kami juga dapat menjalankan tujuan pembangunan secara langsung.

Ada tiga Siklus Hidup Build bawaan utama :

  1. standar
  2. bersih
  3. situs

Setiap Bangun Siklus Hidup terdiri dari Fase

Misalnya defaultsiklus hidup terdiri dari Fase Bangun berikut :

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

Jadi untuk melewati fase di atas, kita hanya perlu memanggil satu perintah:

mvn <phase> { Ex: mvn install }

Untuk perintah di atas, mulai dari fase pertama, semua fase dieksekusi secara berurutan sampai fase 'install'. mvndapat menjalankan tujuan atau fase (atau bahkan beberapa tujuan atau beberapa fase) sebagai berikut:

mvn clean install plugin:goal  

Namun, jika Anda ingin menyesuaikan awalan yang digunakan untuk referensi plugin Anda, Anda dapat menentukan awalan secara langsung melalui parameter konfigurasi pada POM pluginmaven-plugin-plugin Anda .

Fase Pembuatan terdiri dari Sasaran Plugin

Sebagian besar fungsi Maven ada di plugin. Plugin menyediakan sekumpulan tujuan yang dapat dieksekusi menggunakan sintaks berikut:

 mvn [plugin-name]:[goal-name]

Sebagai contoh, proyek Java dapat dikompilasi dengan tujuan kompilasi plug-plugin dengan menjalankan mvn compiler:compile.

Bangun siklus hidup adalah daftar fase bernama yang dapat digunakan untuk memberi perintah untuk eksekusi tujuan.

Sasaran yang disediakan oleh plugin dapat dikaitkan dengan berbagai fase siklus kehidupan. Misalnya, secara default, sasaran compiler:compile dikaitkan dengan compile fase , sedangkan sasaran surefire:test dikaitkan dengan test fase . Pertimbangkan perintah berikut:

mvn test

Ketika perintah sebelumnya dijalankan, Maven menjalankan semua tujuan yang terkait dengan masing-masing fase hingga dan termasuk testfase. Dalam kasus seperti itu, Maven menjalankan resources:resourcestujuan yang terkait dengan process-resourcesfase, kemudian compiler:compile, dan seterusnya hingga akhirnya menjalankan surefire:testtujuan.

Namun, meskipun fase build bertanggung jawab untuk langkah spesifik dalam siklus hidup build, cara di mana ia melakukan tanggung jawab tersebut dapat bervariasi. Dan ini dilakukan dengan mendeklarasikan tujuan plugin yang terikat pada fase build tersebut.

Sasaran plugin mewakili tugas tertentu (lebih baik daripada fase pembangunan) yang berkontribusi pada pembangunan dan pengelolaan proyek. Itu mungkin terikat ke nol atau lebih fase membangun. Sasaran yang tidak terikat pada fase build apa pun dapat dieksekusi di luar siklus hidup build dengan permintaan langsung. Urutan eksekusi tergantung pada urutan di mana tujuan dan fase pembangunan dilibatkan. Sebagai contoh, perhatikan perintah di bawah ini. The cleandan packageargumen adalah membangun tahap, sedangkan dependency:copy-dependenciesadalah tujuan (dari plugin).

mvn clean dependency:copy-dependencies package

Jika ini akan dieksekusi, cleanfase akan dieksekusi terlebih dahulu (artinya akan menjalankan semua fase sebelumnya dari siklus hidup bersih, ditambah cleanfase itu sendiri), dan kemudian dependency:copy-dependenciestujuannya, sebelum akhirnya melaksanakan packagefase (dan semua fase build sebelumnya dari siklus hidup default).

Selain itu, jika suatu tujuan terikat pada satu atau beberapa fase build, tujuan itu akan dipanggil dalam semua fase itu.

Selain itu, fase build juga dapat memiliki nol atau lebih tujuan yang terikat padanya. Jika fase build tidak memiliki tujuan yang terikat padanya, fase build itu tidak akan dijalankan. Tetapi jika ia memiliki satu atau lebih tujuan yang terikat padanya, ia akan melaksanakan semua tujuan itu.

Binding Siklus Hidup Built-in
Beberapa fase memiliki tujuan terikat padanya secara default. Dan untuk siklus hidup default, binding ini tergantung pada nilai kemasan.

Arsitektur Maven:

masukkan deskripsi gambar di sini

Referensi 1
Referensi 2

Sampel Eclipse untuk Pemetaan Siklus Hidup Maven

Sampel Eclipse untuk Pemetaan Siklus Hidup Maven

Premraj
sumber
Jika saya memiliki 2 profil, bisakah saya menjalankan semua plugin profil 1 terlebih dahulu, dan kemudian profil 2?
Bee
[plugin-name]dalam contoh mvn [plugin-name]:[goal-name]ini lebih merupakan awalan plugin . mvn clean installtidak bisa hanya " digunakan dalam skenario multi-modul ". Multi-modul adalah topik yang sangat berbeda.
GeroldBroser mengembalikan Monica
Apakah tujuan yang dilampirkan pada fase yang sama mematuhi urutan apa pun?
belut ghEEz
5
Sebagian besar teks ini disalin kata demi kata dari dokumentasi Maven . Ini harus dinyatakan dengan jelas!
Lii
sumber yang luar biasa!
Bobo
45

Jawaban yang dipilih bagus, tetapi saya masih ingin menambahkan sesuatu yang kecil pada topik. Sebuah ilustrasi.

Itu dengan jelas menunjukkan bagaimana berbagai fase mengikat ke berbagai plugin dan tujuan yang diungkapkan oleh plugin tersebut.

Jadi, mari kita periksa kasus menjalankan sesuatu seperti mvn compile:

  • Ini adalah fase yang menjalankan plugin kompiler dengan tujuan kompilasi
  • Plugin kompiler mendapat tujuan berbeda. Untuk mvn compileitu dipetakan ke tujuan tertentu, kompilasi tujuan.
  • Ini sama dengan berlari mvn compiler:compile

Oleh karena itu, fase terdiri dari tujuan plugin .

masukkan deskripsi gambar di sini

Tautan ke referensi

Johnny
sumber
20
mengapa mvn testmenunjuk package, dan mvn installmenunjuk deploy?
Abdull
2
Sepertinya kesalahan ilustrasi, terima kasih telah memperhatikan (menemukannya di web).
Johnny
3
Dari mana Anda mendapatkan ilustrasi itu? Apakah Anda memeriksa persyaratan hak cipta dan penggunaan?
Abdull
1
@Abdull image diambil dari sini carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (dan juga muncul di banyak halaman web lain) menambahkannya ke jawabannya. Terima kasih telah menyampaikan poin ini, tidak menyadari pentingnya hal itu.
Johnny
1
Pointer dari fase ke plugin dalam diagram juga tidak benar, jarplugin benar-benar berjalan dalam packagefase. Dan pom di sandwich antara fase dan plugin agak membingungkan (saya berasumsi itu berarti bahwa di pom Anda dapat mengkonfigurasi plugin mana yang dijalankan di fase mana, di samping bindings default). Namun, prinsip umumnya benar.
Alexander Klimetschek
43

Definisi ini dirinci di halaman situs Maven Pengantar Siklus Hidup Bangun , tetapi saya telah mencoba meringkas :

Maven mendefinisikan 4 item proses pembuatan:

  1. Lingkaran kehidupan

    Tiga built-in siklus hidup (alias membangun siklus hidup ): default, clean, site. ( Referensi Siklus Hidup )

  2. Tahap

    Setiap siklus hidup terdiri dari fase , misalnya untuk defaultsiklus hidup: compile, test, package, install, dll

  3. Plugin

    Artefak yang menyediakan satu atau lebih tujuan.

    Berdasarkan pada jenis kemasan ( jar,, wardll.) Tujuan plugin terikat ke fase secara default. ( Binding Siklus Hidup Bawaan )

  4. Tujuan

    Tugas (aksi) yang dijalankan. Plugin dapat memiliki satu atau lebih tujuan.

    Satu atau lebih sasaran perlu ditentukan saat mengonfigurasi plugin dalam POM . Selain itu, jika plugin tidak memiliki fase default yang ditentukan, tujuan yang ditentukan dapat diikat ke fase.

Maven dapat dipanggil dengan:

  1. sebuah fase (misalnya clean, package)
  2. <plugin-prefix>:<goal>(mis. dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(mis. org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

dengan satu atau lebih kombinasi dari setiap atau semua, misalnya:

mvn clean dependency:copy-dependencies package
Sandeep Jindal
sumber
Hanya fase siklus hidup yang benar-benar masuk akal untuk dianggap sebagai "langkah" (dari proses pembangunan). Saya lebih suka menyebutnya 4 entitas / item / hal .
GeroldBroser mengembalikan Monica
Ketika saya melihat dunia Build Phase, saya menganggapnya sebagai fase lain dalam siklus hidup, dan itu membingungkan saya.
Quazi Irfan
26

Saya percaya jawaban yang baik sudah disediakan, tapi saya ingin menambahkan diagram mudah-follow dari berbagai 3 siklus hidup ( build, clean, dan site) dan fase di setiap.

masukkan deskripsi gambar di sini

Fase dalam huruf tebal - adalah fase utama yang umum digunakan.

Lior Bar-On
sumber
2
generate-resourcesmuncul dua kali dan generate-sourcestidak ada.
elingerojo
12

Penghargaan untuk Sandeep Jindal dan Premraj. Penjelasan mereka membantu saya untuk mengerti setelah bingung tentang hal ini untuk sementara waktu.

Saya membuat beberapa contoh kode lengkap & beberapa penjelasan sederhana di sini https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Saya pikir itu dapat membantu orang lain untuk mengerti.

Singkatnya dari tautan, Anda tidak harus mencoba memahami ketiganya sekaligus, pertama-tama Anda harus memahami hubungan dalam kelompok-kelompok ini:

  • Siklus Hidup vs Fase
  • Plugin vs Goal

1. Siklus Hidup vs Fase

Siklus Hidup adalah kumpulan fase secara berurutan, lihat di sini Referensi Siklus Hidup . Ketika Anda memanggil suatu fase , itu juga akan memanggil semua fase sebelum itu.

Misalnya, siklus hidup bersih memiliki 3 fase ( pra-bersih, bersih, pasca-bersih ).

mvn clean

Ini akan memanggil pra-bersih dan bersih .

2. Plugin vs Goal

Sasaran seperti tindakan di Plugin . Jadi jika plugin adalah kelas, sasaran adalah metode.

Anda dapat memanggil sasaran seperti ini:

mvn clean:clean

Ini berarti "panggil tujuan bersih, di plugin bersih" (Tidak ada yang terkait dengan fase bersih di sini. Jangan biarkan kata "bersih" membingungkan Anda, mereka tidak sama!)

3. Sekarang hubungan antara Fase & Sasaran:

Fase dapat (pra) menautkan ke Sasaran . Misalnya, biasanya, fasa bersih terhubung ke sasaran bersih. Jadi, ketika Anda memanggil perintah ini:

mvn clean

Ini akan memanggil fase pra-bersih dan fase bersih yang menghubungkan ke tujuan clean: clean.

Ini hampir sama dengan:

mvn pre-clean clean:clean

Lebih detail dan contoh lengkap ada di https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

Surasin Tancharoen
sumber
2

Terminologi kerja Maven memiliki fase dan tujuan.

Fase: Fase Maven adalah serangkaian tindakan yang dikaitkan dengan 2 atau 3 tujuan

exmaple: - jika Anda menjalankan mvn clean

ini adalah fase yang akan menjalankan tujuan mvn clean: clean

Gol: Gol Maven dibatasi dengan fase

untuk referensi http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

Venky Vungarala
sumber
4
Itu tidak harus "dikaitkan dengan 2 atau 3 tujuan" tentu. Bisa jadi tidak ada , satu atau lebih dari tiga , juga.
GeroldBroser mengembalikan Monica
1

Ada tiga siklus hidup bawaan berikut ini:

  • standar
  • bersih
  • situs

Siklus hidup default -> [memvalidasi, menginisialisasi, menghasilkan-sumber, sumber proses, sumber daya proses, sumber daya proses, kompilasi, kelas proses, sumber uji sumber, sumber uji proses, sumber daya uji coba, proses -test-sumber daya, uji-kompilasi, kelas-proses-tes, tes, persiapan-paket, paket, pra-integrasi-tes, integrasi-tes, post-integrasi-tes, verifikasi, instal, sebarkan]

Siklus hidup bersih -> [pra-bersih, bersih, pasca-bersih]

Situs siklus hidup -> [pra-situs, situs, pasca-situs, penyebaran situs]

Alurnya berurutan, misalnya, untuk siklus hidup default , ini dimulai dengan memvalidasi , kemudian menginisialisasi dan seterusnya ...

Anda dapat memeriksa siklus hidup dengan mengaktifkan mode debug mvnyaitu,mvn -X <your_goal>

Vishrant
sumber