Apa perbedaan / hubungan antara tujuan dan fase Maven? Bagaimana mereka terkait satu sama lain?
Apa perbedaan / hubungan antara tujuan dan fase Maven? Bagaimana mereka terkait satu sama lain?
Jawaban:
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.
mvn archetype:generate
, dan dalam hal ini pakar hanya mengeksekusi tujuan?
mvn test
menjalankan:, --- 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:test
sementara mvn compiler:testCompile
hanya berjalan --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
run --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
yang 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 MvnPhase
kelas yang diuji direferensikan dalam kelas tes). Rupanya fase tidak dipanggil jika suatu tujuan dipanggil secara eksplisit.
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 :
Setiap Bangun Siklus Hidup terdiri dari Fase
Misalnya default
siklus 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'. mvn
dapat 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 test
fase. Dalam kasus seperti itu, Maven menjalankan resources:resources
tujuan yang terkait dengan process-resources
fase, kemudian compiler:compile
, dan seterusnya hingga akhirnya menjalankan surefire:test
tujuan.
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 clean
dan package
argumen adalah membangun tahap, sedangkan dependency:copy-dependencies
adalah tujuan (dari plugin).
mvn clean dependency:copy-dependencies package
Jika ini akan dieksekusi, clean
fase akan dieksekusi terlebih dahulu (artinya akan menjalankan semua fase sebelumnya dari siklus hidup bersih, ditambah clean
fase itu sendiri), dan kemudian dependency:copy-dependencies
tujuannya, sebelum akhirnya melaksanakan package
fase (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:
Sampel Eclipse untuk Pemetaan Siklus Hidup Maven
[plugin-name]
dalam contoh mvn [plugin-name]:[goal-name]
ini lebih merupakan awalan plugin . mvn clean install
tidak bisa hanya " digunakan dalam skenario multi-modul ". Multi-modul adalah topik yang sangat berbeda.
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
:
mvn compile
itu dipetakan ke tujuan tertentu, kompilasi tujuan.mvn compiler:compile
Oleh karena itu, fase terdiri dari tujuan plugin .
Tautan ke referensi
mvn test
menunjuk package
, dan mvn install
menunjuk deploy
?
jar
plugin benar-benar berjalan dalam package
fase. 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.
Definisi ini dirinci di halaman situs Maven Pengantar Siklus Hidup Bangun , tetapi saya telah mencoba meringkas :
Maven mendefinisikan 4 item proses pembuatan:
Lingkaran kehidupan
Tiga built-in siklus hidup (alias membangun siklus hidup ): default
, clean
, site
. ( Referensi Siklus Hidup )
Tahap
Setiap siklus hidup terdiri dari fase , misalnya untuk default
siklus hidup: compile
, test
, package
, install
, dll
Plugin
Artefak yang menyediakan satu atau lebih tujuan.
Berdasarkan pada jenis kemasan ( jar
,, war
dll.) Tujuan plugin terikat ke fase secara default. ( Binding Siklus Hidup Bawaan )
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:
clean
, package
)<plugin-prefix>:<goal>
(mis. dependency:copy-dependencies
)<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
Build Phase
, saya menganggapnya sebagai fase lain dalam siklus hidup, dan itu membingungkan saya.
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.
Fase dalam huruf tebal - adalah fase utama yang umum digunakan.
generate-resources
muncul dua kali dan generate-sources
tidak ada.
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:
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/
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
Ada tiga siklus hidup bawaan berikut ini:
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 mvn
yaitu,mvn -X <your_goal>