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!
maven
maven-3
pom.xml
maven-lifecycle
Jeff Levine
sumber
sumber
Jawaban:
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
mvn
tanpa fase atau sasaran apa pun [dengan jeda baris dan dipersingkat agar mudah dibaca di sini]: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.xml
bagian 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.xml
bawah.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
.sumber
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
Dan memang inilah cara Maven menunjukkannya (unit kerja terkecilnya) melalui string unik di log build-nya:
Misalnya, kami memiliki:
Yang memang berarti (melalui tingkat perincian yang berbeda):
compile
fase (sayangnya tidak disebutkan)>artifactId
danversion
)>compile
tujuannya>default-compile
eksekusiIni 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 selamatest-compile
fase (fase yang berbeda) untuk kode uji kompilasi (melalui nyatestCompile
gol) 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-plugin
dengandefault-compile
id 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.xml
konfigurasi Anda dapat menambahkan barang (eksekusi) ke build atau memengaruhi perilaku plugin yang sudah dikonfigurasi (dalam hal ini tidak adaexecutions
bagian, tetapiconfiguration
sudah cukup).Ya, Anda dapat melewati siklus build (dan tahapannya) dan secara langsung menjalankan tujuan (plugin). Bayangkan yang berikut ini:
(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 package
dan 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).sumber
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:
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 ).
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:
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:
Ini akan memanggil fase pra-pembersihan dan fase bersih yang terhubung ke tujuan bersih: bersih.
Ini hampir sama dengan:
sumber
clean:clean
bukan pilihan terbaik untuk contoh. Ada 4 item bernamaclean
(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 ".Dan terlambat membuat diagram lain
sumber
validate
,initialize
danverify
.resources:[testR|r]esources
Sasaran TIDAK terikat pada faseprocess-sources
atauprocess-test-sources
dalamjar
siklus hidup .modello:java
dari Modello Plugin tampaknya adalah domain-spesifik. Mengikat tujuan plugin ke sebuah fase berlaku untuk semua fase tersebut.Sumber ini adalah tutorial yang sangat bagus
Lifecycles, Lifecycle Phases, Plugins dan Plugin Goals adalah inti dari Maven.
Saat kita menjalankan " paket mvn " di Proyek Java, Maven mengikat tujuan plugin ke fase siklus hidup seperti yang ditunjukkan pada gambar berikutnya.
sumber
mvn ...
: Di default-bindings.xml atau di POM dan tidak dilakukan oleh Maven tetapi oleh manusia.Demikian penjelasan sedikit lebih jauh seperti yang diuraikan di sini
Build Maven dibagi dalam siklus hidup ini adalah:
Setiap siklus ini dibagi menjadi beberapa fase. Misalnya, build dibagi menjadi beberapa fase seperti:
Fase memiliki tujuan untuk menjalankan sebelum pra atau setelah pasca fase, misalnya:
Anda dapat melihat tujuan sebagai fase "dimasukkan" tambahan jika Anda mau. Baca di sini atau lihat jawaban @Gerolds untuk detailnya.
sumber
LifeCycle vs Phases:
Life Cycle
adalah kumpulan dariphases
. Saat Anda memanggil suatu fase, itu juga akan memanggil semua fase yang datang sebelumnya. Maven hadir dengan 3 siklus hidup built-in sebagai:Siklus hidup bersih memiliki 3 fase: pra-pembersihan, pembersihan, dan pasca-pembersihan. Fase default dan siklus hidup situs sama seperti yang ditunjukkan pada gambar.
sumber
mvn <phase>
. Lihat jawaban saya di sini.