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
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
compile
fase (sayangnya tidak disebutkan)>
- Saya menggunakan plugin Maven Compiler (
artifactId
dan version
)>
- Saya meminta
compile
tujuannya>
- seperti yang didefinisikan oleh
default-compile
eksekusi
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-compile
fase (fase yang berbeda) untuk kode uji kompilasi (melalui nya testCompile
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
dengan default-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 ada executions
bagian, tetapi configuration
sudah 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 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).