Apa tujuan dari file mvnw dan mvnw.cmd?

257

Ketika saya membuat aplikasi Spring Boot saya bisa melihat mvnwdan mvnw.cmdfile di root proyek. Apa tujuan dari kedua file ini?

shaunthomas999
sumber

Jawaban:

345

File-file ini dari bungkus Maven . Ini bekerja mirip dengan pembungkus Gradle .

Ini memungkinkan Anda untuk menjalankan proyek Maven tanpa menginstal Maven dan hadir di jalan. Ini mengunduh versi Maven yang benar jika tidak ditemukan (sejauh yang saya tahu secara default di direktori home pengguna Anda).

The mvnwfile untuk Linux (bash) dan mvnw.cmdadalah untuk lingkungan Windows.


Untuk membuat atau memperbarui semua file Maven Wrapper yang diperlukan, jalankan perintah berikut:

mvn -N io.takari:maven:wrapper

Untuk menggunakan versi pakar yang berbeda, Anda dapat menentukan versi sebagai berikut:

mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

Kedua perintah membutuhkan maven on PATH(tambahkan path ke maven binke Pathpada System Variables) jika Anda sudah memiliki mvnw di proyek Anda, Anda dapat menggunakan ./mvnwalih-alih mvndalam perintah.

Menghindari
sumber
Jawaban Anda sangat membantu. Saya memeriksa dokumentasi bungkus maven. Saya menggunakan mvnperintah untuk operasi pakar meskipun saya bisa menggunakan ./mvnwuntuk tujuan yang sama.
shaunthomas999
2
Terima kasih atas jawabannya. Bisakah Anda menjelaskan kapan ini dihasilkan, seperti apakah itu ketika Anda awalnya membuat proyek? Apakah akan diperbarui sepanjang baris ketika Anda melakukan perubahan pada pom Anda seperti menambahkan hapus dependensi / plugin?
Asanke
1
dan, haruskah Anda menambahkan / mengkomit file mvnw.cmd?
jpganz18
ya tentu saja. ini memungkinkan Anda untuk menjalankan maven build dengan cepat tanpa perlu menginstal maven tambahan atau memilikinya di PATH.
Menghindar
1
Terima kasih banyak atas jawabannya, ini sangat membantu ¿Bisakah Anda memberi tahu kami sesuatu tentang portabilitas file pengaturan pakar ketika kami bekerja dengan cara itu? Salud dan terima kasih lagi.
Daniel Hernández
26

Perintah mvnwmenggunakan Maven yang secara default diunduh ~/.m2/wrapperpada penggunaan pertama.

URL dengan Maven ditentukan di setiap proyek di .mvn/wrapper/maven-wrapper.properties:

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip

Untuk memperbarui atau mengubah versi Maven lakukan hal berikut (ingat --non-recursiveuntuk proyek multi-modul):

./mvnw io.takari:maven:wrapper -Dmaven=3.3.9 

atau hanya memodifikasi .mvn/wrapper/maven-wrapper.properties secara manual.

Untuk menghasilkan pembungkus dari awal menggunakan Maven (Anda harus sudah PATHmenjalankannya:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 
Michal Kordas
sumber
5

The Maven Wrapper adalah pilihan yang sangat baik untuk proyek-proyek yang membutuhkan versi tertentu dari Maven (atau untuk pengguna yang tidak ingin menginstal Maven sama sekali). Alih-alih menginstal banyak versi di sistem operasi, kita bisa menggunakan skrip wrapper khusus proyek.

mvnw: ini adalah skrip Unix shell yang dapat dieksekusi yang digunakan sebagai pengganti Maven yang diinstal penuh

mvnw.cmd : ini untuk lingkungan Windows


Gunakan Kasing

Wrapper harus bekerja dengan sistem operasi yang berbeda seperti:

  • Linux
  • OSX
  • Windows
  • Solaris

Setelah itu, kita dapat menjalankan tujuan kita seperti ini untuk sistem Unix:

./mvnw clean install

Dan perintah berikut untuk Batch:

./mvnw.cmd clean install

Jika kami tidak memiliki Maven yang ditentukan di properti wrapper, itu akan diunduh dan diinstal di folder $USER_HOME/.m2/wrapper/distssistem.


Plugin Maven Wrapper

Plugin Maven Wrapper untuk melakukan instalasi otomatis dalam proyek Spring Boot sederhana.

Pertama, kita harus masuk ke folder utama proyek dan menjalankan perintah ini:

mvn -N io.takari:maven:wrapper

Kami juga dapat menentukan versi Maven:

mvn -N io.takari:maven:wrapper -Dmaven=3.5.2

Opsi -N berarti –non-rekursif sehingga pembungkus hanya akan diterapkan pada proyek utama direktori saat ini, bukan pada submodul mana pun.

Patel Romil
sumber
2

Sejauh ini pilihan terbaik saat ini akan menggunakan wadah pakar sebagai alat pembangun. Sebuah mvn.shscript seperti ini akan cukup:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
André
sumber
7
Ini tidak menjawab pertanyaan OP, itu hanya menyarankan alternatif
ahmedjaad
2
Ide dasar maven wrapper adalah mendeklarasikan versi maven yang tepat untuk proyek ini. Dan bonus menghindari kebutuhan untuk menginstal pakar secara manual. Pendekatan Anda tidak hanya meleset untuk menyelesaikan masalah versi tetapi membutuhkan satu lagi alat yang dipasang secara lokal.
Max
2
Juga perhatikan bahwa ini me-mount pengguna yang memiliki repositori Maven lokal ke instance buruh pelabuhan. Biasanya ini berjalan sebagai root, jadi apapun yang ditulis oleh maven dockerized dimiliki oleh root di Linux. Ini belum tentu diinginkan. Saya menemukan instance nexus setup yang benar diakses oleh instance buruh pelabuhan tidak begitu menyakitkan, terutama jika Anda menginginkan build yang dapat direproduksi.
Thorbjørn Ravn Andersen
Itu sudah lama sekali, tetapi saya masih lebih suka cara ini. Tentang versi maven, tag gambar menyediakannya (lihat saja halaman maven di Docker Hub). Adapun kepemilikan root, itu tidak terjadi pada desktop docker - tetapi memang terjadi di kotak linux (dan membangun node, tentu saja). Trik kecil dapat "memaksa" UID saat ini dalam kasus ini (-u argumen), sehingga masalahnya ditangani. Tetapi semua cara saya menemukan pendekatan pendekatan ini besarnya lebih baik. Docker tetap ada di mana-mana, khususnya pada node yang dibangun.
André
1
(Lanjutan) Pengaturan dan pola pikir Jenkins di sekolah lama mengarah pada hal semacam ini. Alat CI / CD modern melakukan yang sebaliknya: Anda hanya memilih wadah buatan. Tapi itu hanya pendapat saya.
André