Maven: Siklus Hidup vs. Fase vs. Plugin vs. Sasaran [ditutup]

106

Pengembang yang relatif baru di sini, meskipun saya telah menggunakannya sebentar, saya berharap untuk memperkuat fundamental Maven saya. Sebagian dari masalah saya adalah saya tidak memiliki pengalaman dengan Ant, yang tampaknya berasal dari banyak penjelasan. Saya telah membaca dan menonton tutorial, dan saya terus mendengar istilah yang sama:

  • Lingkaran kehidupan
  • Tahap
  • Plugin
  • Tujuan

Dari apa yang telah saya pelajari, tampaknya siklus hidup adalah yang terluas dari kelompok itu, dan terdiri dari (atau diselesaikan oleh) fase, plugin, dan / atau tujuan.

Pertanyaan : Bisakah Anda memberikan info tentang bagaimana istilah-istilah ini terkait dan contoh paling umum?

Semakin eksplisit dan mendasar, semakin baik!

Jeff Levine
sumber
Terima kasih @Drejc - tidak percaya saya tidak menemukan ini dalam pencarian saya. Saya akan membacanya sekarang.
Jeff Levine
2
Jadi, untuk memperjelas, buat siklus hidup = siklus hidup , yang terdiri dari tiga jenis: default, bersih, dan situs? Penjelasan lain membuat saya berpikir bahwa ada siklus hidup keempat yang disebut build .
Jeff Levine
3
Terlalu luas? Ini menyangkut dasar-dasar inti Maven dan memiliki beberapa jawaban yang bagus dan terperinci. Moderator tanpa satu tag maven tidak diperbolehkan untuk memutuskan ini.
Gerold Broser

Jawaban:

73

Sebuah Maven siklus hidup adalah (abstrak) konsep yang mencakup semua langkah (atau lebih baik: semua langkah Maven desainer memutuskan untuk dukungan) yang diharapkan terjadi dalam hidup pengembangan proyek. Langkah-langkah (atau tahapan) ini disebut fase dalam terminologi Maven.

Sebuah Maven Plugin adalah wadah untuk / pemasok gol. Kode yang diterapkan dalam tujuan adalah pekerja keras yang nyata. ( Maven pada intinya sendiri hanya mengelola plugin dan menjalankan tujuan ). Setiap tujuan plugin dapat ditetapkan / diikat ke salah satu fase siklus proses.

Saat menjalankan mvn <phase> Maven melewati semua fase (setiap saat) dan menjalankan semua tujuan (disediakan oleh plugin) yang telah terikat ke salah satu fase sebelum dan hingga (dan termasuk) fase yang diberikan. Jika ada fase tanpa tujuan yang terikat padanya, tidak ada yang dilakukan. Tapi fase itu sudah berlalu.

Yaitu, Anda tidak bisa "'memasukkan' fase tambahan" ke dalam salah satu siklus hidup bawaan Maven. Mereka sudah ada di sana, selalu! Anda dapat mengembangkan siklus hidup Anda sendiri dengan tahapannya sendiri, tetapi itu jauh lebih dari sekadar menggunakan Maven sebagaimana adanya.

Sasaran juga dapat dieksekusi secara langsung, yang diberitahukan kepada Anda saat berlari mvntanpa fase atau sasaran apa pun [dengan jeda baris dan dipersingkat agar mudah dibaca di sini]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Referensi:

Jika Anda pernah bertanya-tanya bagaimana Maven tahu apa yang harus dilakukan tanpa ada tujuan yang mengikat di POM, ada tautan ke default-bindings.xmlbagian akhir yang terletak di <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Fase untuk siklus hidup bawaan ( bersih , default , situs ) dideklarasikan di <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlbawah .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.

Gerold Broser
sumber
41

Maven: Siklus Hidup vs. Fase vs. Plugin vs. Sasaran

Menjawab terlambat hanya untuk mengklarifikasi tingkat perincian lain yang hilang di utas ini: eksekusi (tujuan), yang merupakan unit terkecil dari build Maven.

Karenanya, kami memiliki siklus build (pada dasarnya, serangkaian tindakan untuk tujuan keseluruhan tertentu), yang terdiri dari fase (perincian lebih rendah, langkah siklus), yang dapat menjalankan serangkaian tujuan yang dikonfigurasi yang disediakan oleh plugin tertentu . Artinya, Maven adalah (juga) pelaksana plugin, setiap plugin dapat menawarkan satu atau lebih tujuan. Anda kemudian (juga) memutuskan tujuan mana yang dilampirkan ke fase mana, sebagian besar waktu dalam siklus hidup defaul (tanpa apa pun, yaitu default). Tetapi Anda sebenarnya dapat memiliki level lain: eksekusi (dengan tujuan yang sama, dari plugin yang sama, atau tujuan yang berbeda dari plugin yang berbeda)

Sebuah gambar yang saya siapkan untuk melanjutkan keseluruhan masukkan deskripsi gambar di sini

Dan memang inilah cara Maven menunjukkannya (unit kerja terkecilnya) melalui string unik di log build-nya:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Misalnya, kami memiliki:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

Yang memang berarti (melalui tingkat perincian yang berbeda):

  • selama compilefase (sayangnya tidak disebutkan)>
  • Saya menggunakan plugin Maven Compiler ( artifactIddan version)>
  • Saya meminta compiletujuannya>
  • seperti yang didefinisikan oleh default-compileeksekusi

Ini unik karena memang Anda dapat memiliki tujuan yang sama (dari plugin yang sama) yang terikat ke fase yang berbeda atau ke fase yang sama tetapi dalam eksekusi yang berbeda (yaitu, dengan konfigurasi yang berbeda). The maven-compiler-plugin, misalnya, juga digunakan selama test-compilefase (fase yang berbeda) untuk kode uji kompilasi (melalui nya testCompilegol) dalam eksekusi yang berbeda ( default-testCompile). Anda juga dapat mengkompilasi (menggunakan plugin dan tujuan yang sama) beberapa kode yang dibuat secara otomatis selama fase yang berbeda seperti yang ditentukan oleh eksekusi yang Anda tentukan di POM (dan kemungkinan konfigurasi yang berbeda).

Eksekusi default disediakan out-of-the-box melalui Maven packaging bindings , yaitu, secara default (dan menegakkan konvensi melalui konfigurasi) Maven sudah memanggil tujuan tertentu (plugin standar) selama fase tertentu. ID eksekusi dari pemanggilan default ini ditentukan menurut konvensi tertentu .

Ini juga menjelaskan mengapa jika Anda benar-benar ingin mengganti perilaku default (pengikatan) dari sebuah build Maven, Anda perlu menentukan (mengganti) id eksekusi yang sama persis di POM Anda untuk plugin yang sama. Anda dapat, misalnya, melewati kompilasi yang hanya mendefinisikan eksekusi maven-compiler-plugindengan default-compileid yang sama tetapi terikat ke fase yang tidak ada (atau fase kosong).

Singkatnya : eksekusi memberi tahu Maven tujuan mana yang akan dieksekusi dengan konfigurasi mana dalam fase apa.

Beberapa eksekusi disediakan secara default (defaul bindings), yang menjelaskan mengapa maven minimal pom hanya 6 baris sudah dapat melakukan banyak hal (kompilasi, tes, paket, dll.): Mengeksekusi tujuan plugin standar dalam fase tertentu: konvensi sudah selesai konfigurasi. Kemudian, melalui pom.xmlkonfigurasi Anda dapat menambahkan barang (eksekusi) ke build atau memengaruhi perilaku plugin yang sudah dikonfigurasi (dalam hal ini tidak ada executionsbagian, tetapi configurationsudah cukup).

Ya, Anda dapat melewati siklus build (dan tahapannya) dan secara langsung menjalankan tujuan (plugin). Bayangkan yang berikut ini:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(CATATAN: Anda juga dapat memanggil sebaris hanya dalam satu panggilan)

Di sini kami menyusun kode aplikasi, kode pengujian, menjalankan pengujian dan paket: bayangkan betapa manual, rawan kesalahan, berulang, dan memakan waktu ini. Konvensi atas konfigurasi membantu kita: Maven memperkenalkan fase dan siklus hidup build . Siklus hidup default (tanpa nama, yaitu default), menyediakan berbagai fase berdasarkan praktik dan konvensi terbaik (mantra Maven).
Jika Anda ingin mencapai hal yang sama seperti di atas, jalankan saja: mvn packagedan secara otomatis akan mengompilasi, menguji, dan mengemas proyek Anda. Bagaimana? meminta plugin. Artinya, fase adalah rangkaian eksekusi (sasaran) plugin yang bermakna dan dapat dikonfigurasi. Untuk membuatnya lebih standar, untuk setiap fase Maven pertama-tama akan memanggil fase sebelumnya, jadi misalnya jika Anda ingin menguji Anda akan yakin Anda mengkompilasi terlebih dahulu.

ps perhatikan bahwa ketika menentukan beberapa tujuan untuk tujuan yang sama execution, Anda masih akan melihat dengan jelas di log build dua eksekusi berbeda (dengan id yang sama) untuk dua tujuan berbeda (karenanya, masih tupel unik).

A_Di-Matteo
sumber
18

Penghargaan untuk Sandeep Jindal dan Premraj (dari sini Apa tujuan dan fase Maven dan apa perbedaannya? ). Penjelasan mereka membantu saya untuk mengerti.

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 ini dapat membantu orang lain untuk memahami dan dapat mencoba sesuatu secara langsung.

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

  • Siklus Hidup vs Fase
  • Plugin vs Tujuan

1. Siklus Hidup vs Fase

Life Cycle adalah kumpulan fase secara berurutan, lihat di sini Referensi Siklus Hidup . Saat Anda memanggil suatu fase , itu juga akan memanggil semua fase sebelumnya.

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

mvn clean

Ini akan memanggil pra-bersih dan bersih .

2. Plugin vs Tujuan

Sasaran seperti aksi di Plugin . Jadi jika plugin adalah sebuah kelas, tujuannya adalah sebuah metode.

Anda dapat membuat tujuan seperti ini:

mvn clean:clean

Artinya "panggil tujuan bersih, di plugin bersih" (Tidak ada yang berhubungan dengan fase bersih di sini. Jangan biarkan kata "bersih" membingungkan Anda, mereka tidak sama! Lihat penjelasan lengkapnya di tautan saya di atas)

3. Sekarang hubungan antara Fase & Sasaran:

Fase dapat (pra) ditautkan ke Sasaran . Misalnya, biasanya, fase bersih ditautkan ke sasaran bersih. Jadi, saat Anda memanggil perintah ini:

mvn clean

Ini akan memanggil fase pra-pembersihan dan fase bersih yang terhubung ke tujuan bersih: bersih.

Ini hampir sama dengan:

mvn pre-clean clean:clean
Surasin Tancharoen
sumber
1
@ 2. & 3. IMHO, clean:cleanbukan pilihan terbaik untuk contoh. Ada 4 item bernama clean(siklus hidup, fase, plugin, tujuan) yang mungkin membingungkan, terutama untuk pemula (saya ingat itu untuk saya di awal). @ 3. Kata kerja "link" juga bukan pilihan yang baik, IMHO. Istilah resmi Maven adalah " mengikat ".
Gerold Broser
@Tokopedia Sepenuhnya setuju dengan bersih: bersih. Saya telah menjelaskan dan memperingatkan itu dalam penjelasan lengkap saya di tautan. Saya akan menyalin peringatan itu ke sini juga. Alasan saya menggunakannya karena itu bagus untuk memberi tahu orang-orang tentang kata yang membingungkan ini dan, terutama, dokumen resmi maven menggunakannya dan menjelaskannya dengan jelas. Dan ya, itu membuatku bingung juga. Bagaimanapun, terima kasih banyak atas komentarnya
Surasin Tancharoen
salah ketik: dokumen resmi maven menggunakannya dan tidak menjelaskannya dengan jelas
Surasin Tancharoen
17

Dan terlambat membuat diagram lain

  • Siklus hidup sebagai persegi panjang kuning
  • Fase siklus hidup sebagai persegi panjang biru dengan fase "yang dapat dipanggil" dalam warna biru tua (yaitu fase dengan tanda hubung biasanya tidak dipanggil dari baris perintah karena mungkin tidak dirancang untuk meninggalkan proyek dalam keadaan yang ditentukan dengan baik).
  • Sasaran sebagai tablet hisap biru. The Association / binding "phase -> goal" yang ditampilkan adalah salah satu mode pengemasan "jar" . Setiap fase dapat memiliki tujuan yang terikat padanya. Ini tentu saja menahan untuk setiap siklus proses, meskipun binding hanya ditampilkan untuk siklus proses "default".
  • Plugin sebagai persegi panjang terpotong abu-abu. Plugin menyediakan Sasaran yang dapat terikat ke Fase.

Siklus Hidup Maven, Fase, Sasaran, Plugin

David Tonhofer
sumber
File graphml (diedit dengan editor yEd gratis) tersedia di github.com/dtonhofer/diagrams
David Tonhofer
1) Apa yang Anda maksud dengan fase "yang dapat dipanggil " yang " berwarna biru tua "? Setiap fase Maven adalah "dapat dipanggil" (meskipun saya lebih suka menyebutnya tidak dapat dipanggil , karena tidak ada kode yang dipanggil secara langsung dengan memanggil fase). Atau apakah Anda menyebut fase " dapat dipanggil " yang memiliki tujuan terikat padanya (secara default)? Bahkan itu tidak benar, jika Anda melihat validate, initializedan verify.
Gerold Broser
2) resources:[testR|r]esourcesSasaran TIDAK terikat pada fase process-sourcesatau process-test-sourcesdalam jarsiklus hidup .
Gerold Broser
3) modello:javadari Modello Plugin tampaknya adalah domain-spesifik. Mengikat tujuan plugin ke sebuah fase berlaku untuk semua fase tersebut.
Gerold Broser
@GeroldBroser Diperbaiki menurut komentar. "Dapat dipanggil" berarti seseorang dapat memanggilnya dari baris perintah dan berharap proyek tetap dalam status yang valid. Tidak ada perbedaan yang berarti antara memanggil dan memanggil dan memanggil adalah apa yang digunakan Pendahuluan Maven .
David Tonhofer
12

Sumber ini adalah tutorial yang sangat bagus

Lifecycles, Lifecycle Phases, Plugins dan Plugin Goals adalah inti dari Maven.

  • Perintah Maven mvn hanya dapat menerima Tahap Siklus Hidup atau Tujuan Plugin sebagai argumen.
  • Maven hadir dengan tiga siklus hidup - default, bersih, dan situs.
  • Setiap siklus hidup terdiri dari fase siklus hidup dan secara keseluruhan, ada 28 fase - default 21 ( validasi, ..., kompilasi, ..., paket, ..., instal, terapkan ), bersih 3 ( pra-bersihkan, clean, post-clean ) dan situs 4 ( pra-situs, situs, pasca-situs, penerapan situs ).
  • ketika fase siklus hidup dipanggil menggunakan perintah mvn, semua fase sebelumnya dijalankan secara berurutan satu demi satu.
  • fase siklus hidup itu sendiri tidak memiliki kemampuan untuk menyelesaikan beberapa tugas dan mereka mengandalkan plugin untuk menjalankan tugas tersebut.
  • bergantung pada proyek dan jenis pengemasan, Maven mengikat berbagai tujuan plugin ke fase siklus proses dan tujuan menjalankan tugas yang dipercayakan kepadanya.

Saat kita menjalankan " paket mvn " di Proyek Java, Maven mengikat tujuan plugin ke fase siklus hidup seperti yang ditunjukkan pada gambar berikutnya.

mvn-plugins-package-goal

Erlan
sumber
1
Materi yang Anda sebutkan cukup bagus. Terima kasih!
William Kinaan
@ " Perintah Maven mvn hanya dapat menerima Fase Siklus Hidup atau Tujuan Plugin sebagai argumen. " Tidak benar. Ia menerima opsi juga.
Gerold Broser
" Saat kami menjalankan" paket mvn "di Proyek Java, Maven mengikat tujuan plugin ke fase siklus hidup " tidak benar. Pengikatan tujuan terjadi jauh sebelum dijalankan mvn ...: Di default-bindings.xml atau di POM dan tidak dilakukan oleh Maven tetapi oleh manusia.
Gerold Broser
7

Demikian penjelasan sedikit lebih jauh seperti yang diuraikan di sini

Build Maven dibagi dalam siklus hidup ini adalah:

  • bersih
  • build (default)
  • situs

Setiap siklus ini dibagi menjadi beberapa fase. Misalnya, build dibagi menjadi beberapa fase seperti:

  • persiapkan sumber daya
  • menyusun
  • paket
  • Install

Fase memiliki tujuan untuk menjalankan sebelum pra atau setelah pasca fase, misalnya:

  • pre-clean - akan dijalankan sebelum fase pembersihan
  • post-clean - akan dijalankan setelah fase pembersihan

Anda dapat melihat tujuan sebagai fase "dimasukkan" tambahan jika Anda mau. Baca di sini atau lihat jawaban @Gerolds untuk detailnya.

Drejc
sumber
1
Jawaban ini tidak sepenuhnya benar. Lihat jawaban saya .
Gerold Broser
Wahai anak laki-laki 3 tahun sejak Anda menjawab pertanyaan ini ... dan masih tidak membiarkannya pergi .. Anda menang ... sekarang lanjutkan.
Drejc
Ini bukan tentang menang. Tidakkah Anda merevisi pertanyaan, jawaban, dan komentar lama jika Anda menemukannya nanti?
Gerold Broser
3

LifeCycle vs Phases: Life Cycle adalah kumpulan dari phases. Saat Anda memanggil suatu fase, itu juga akan memanggil semua fase yang datang sebelumnya. Maven hadir dengan 3 siklus hidup built-in sebagai:

  1. Siklus hidup bersih- ini melibatkan pembersihan proyek (untuk pembangunan & penerapan baru)
  2. Siklus hidup default / build- ini menangani penerapan lengkap proyek
  3. Siklus hidup situs- ini menangani pembuatan dokumentasi java proyek. masukkan deskripsi gambar di sini

Siklus hidup bersih memiliki 3 fase: pra-pembersihan, pembersihan, dan pasca-pembersihan. Fase default dan siklus hidup situs sama seperti yang ditunjukkan pada gambar.

Arun Raaj
sumber
Paragraf terakhir Anda menyesatkan. Terutama kalimat pertama dan terakhir. Sasaran dan fase adalah hal yang sangat berbeda. Anda tidak boleh membingungkan mereka karena beberapa di antaranya memiliki nama yang identik. Re " Sasaran adalah fase yang Anda lihat pada gambar di atas. ": Tidak ada satu tujuan pun yang disebutkan dalam gambar. Ini semua adalah fase . Kembali " Anda menulis nama fase sebagai 'tujuan' ketika Anda harus melakukan tujuan tertentu. ": Meskipun memungkinkan untuk menjalankan tujuan plugin secara eksplisit, cara yang biasa adalah melakukan peningkatan ke fase tertentu dengan mvn <phase>. Lihat jawaban saya di sini.
Gerold Broser
Terima kasih, saya telah menghapus bagian "Plugin vs Sasaran". Saya akan segera memperbaruinya.
Arun Raaj