วัตถุประสงค์ของไฟล์ mvnw และ mvnw.cmd คืออะไร?


257

เมื่อฉันสร้างแอปพลิเคชัน Spring Boot ฉันสามารถเห็นmvnwและmvnw.cmdไฟล์ในรูทของโครงการ จุดประสงค์ของไฟล์ทั้งสองนี้คืออะไร?

คำตอบ:


345

ไฟล์เหล่านี้จากMaven เสื้อคลุม มันทำงานคล้าย ๆ กับเสื้อคลุม Gradle

สิ่งนี้อนุญาตให้คุณเรียกใช้โครงการ Maven โดยไม่ต้องมี Maven ติดตั้งและนำเสนอบนเส้นทาง มันดาวน์โหลดรุ่น Maven ที่ถูกต้องหากไม่พบ (เท่าที่ฉันรู้ตามค่าเริ่มต้นในไดเรกทอรีบ้านของผู้ใช้ของคุณ)

mvnwไฟล์สำหรับลินุกซ์ (ทุบตี) และmvnw.cmdสำหรับสภาพแวดล้อมของ Windows


ในการสร้างหรืออัพเดตไฟล์ Maven Wrapper ที่จำเป็นทั้งหมดดำเนินการคำสั่งต่อไปนี้:

mvn -N io.takari:maven:wrapper

หากต้องการใช้ maven เวอร์ชันอื่นคุณสามารถระบุเวอร์ชันดังต่อไปนี้:

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

ทั้งสองคำสั่งต้องการ maven on PATH(เพิ่มพา ธ ไปยัง maven binไปPathที่ System Variables) หากคุณมี mvnw ในโครงการของคุณคุณสามารถใช้./mvnwแทนmvnคำสั่ง


คำตอบของคุณมีประโยชน์มาก ฉันตรวจสอบเอกสารห่อหุ้ม maven ฉันใช้mvnคำสั่งสำหรับการดำเนินการ maven แต่ฉันสามารถใช้./mvnwเพื่อวัตถุประสงค์เดียวกัน
shaunthomas999

2
ขอบคุณสำหรับคำตอบ. คุณสามารถอธิบายได้เมื่อสิ่งนี้เกิดขึ้นเช่นเดียวกับเมื่อคุณสร้างโครงการในตอนแรก มันจะได้รับการอัปเดตตามสายเมื่อคุณทำการเปลี่ยนแปลง pom ของคุณเช่นเพิ่มการลบการอ้างอิง / ปลั๊กอิน?
Asanke

1
และคุณควรเพิ่ม / ส่งไฟล์ mvnw.cmd หรือไม่
jpganz18

ใช่แน่นอน มันช่วยให้คุณรัน maven build ได้อย่างรวดเร็วโดยไม่จำเป็นต้องติดตั้ง maven เพิ่มเติมหรือมีไว้บน PATH
Dodge

1
ขอบคุณมากสำหรับคำตอบมันมีประโยชน์มาก¿คุณช่วยบอกเราเกี่ยวกับความสามารถในการพกพาของไฟล์การตั้งค่า maven เมื่อเราทำงานในลักษณะนั้นได้อย่างไร Saludos และขอบคุณอีกครั้ง
Daniel Hernández

26

คำสั่งmvnwจะใช้ Maven ซึ่งเป็นค่าเริ่มต้นที่ดาวน์โหลดไว้~/.m2/wrapperในการใช้ครั้งแรก

ระบุ URL ด้วย Maven ในแต่ละโครงการที่.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

หากต้องการอัปเดตหรือเปลี่ยนเวอร์ชัน Maven ให้เรียกใช้สิ่งต่อไปนี้ (จดจำเกี่ยวกับ--non-recursiveโครงการหลายโมดูล):

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

หรือเพียงแก้ไข.mvn/wrapper/maven-wrapper.propertiesด้วยตนเอง

ในการสร้าง wrapper ตั้งแต่เริ่มต้นโดยใช้ Maven (คุณต้องPATHเปิดใช้แล้ว:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 

5

The Maven Wrapperเป็นตัวเลือกที่ยอดเยี่ยมสำหรับโครงการที่ต้องการ Maven เวอร์ชันเฉพาะ (หรือสำหรับผู้ใช้ที่ไม่ต้องการติดตั้ง Maven เลย) แทนที่จะติดตั้งหลายเวอร์ชันในระบบปฏิบัติการเราสามารถใช้สคริปต์ตัวห่อเฉพาะโครงการ

mvnw:เป็นเชลล์สคริปต์ Unix ที่รันได้ซึ่งใช้แทน Maven ที่ติดตั้งไว้อย่างสมบูรณ์

mvnw.cmd : สำหรับสภาพแวดล้อม Windows


ใช้เคส

wrapper ควรทำงานกับระบบปฏิบัติการต่าง ๆ เช่น:

  • ลินุกซ์
  • OSX
  • ของ windows
  • Solaris

หลังจากนั้นเราสามารถเรียกใช้เป้าหมายของเราเช่นนี้สำหรับระบบ Unix:

./mvnw clean install

และคำสั่งต่อไปนี้สำหรับแบทช์:

./mvnw.cmd clean install

หากเราไม่มี Maven ที่ระบุไว้ในคุณสมบัติของ wrapper มันจะถูกดาวน์โหลดและติดตั้งในโฟลเดอร์$USER_HOME/.m2/wrapper/distsของระบบ


ปลั๊กอิน Maven Wrapper

ปลั๊กอิน Maven Wrapperเพื่อทำการติดตั้งอัตโนมัติในโครงการ Spring Boot อย่างง่าย

อันดับแรกเราต้องเข้าไปในโฟลเดอร์หลักของโครงการและเรียกใช้คำสั่งนี้:

mvn -N io.takari:maven:wrapper

นอกจากนี้เรายังสามารถระบุรุ่น Maven:

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

อ็อพชัน -N หมายถึง –non-recursive เพื่อให้ wrapper นั้นถูกนำไปใช้กับโปรเจ็กต์หลักของไดเร็กตอรี่ปัจจุบันเท่านั้น, ไม่ใช่ใน submodules ใด ๆ


2

โดยทางเลือกที่ดีที่สุดในปัจจุบันจะใช้ภาชนะ maven เป็นเครื่องมือสร้าง mvn.shสคริปต์เช่นนี้จะเพียงพอที่:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"

7
นี่ไม่ได้ตอบคำถาม OP มันแค่แนะนำทางเลือก
ahmedjaad

2
แนวคิดพื้นฐานของ wrapper maven คือการประกาศ maven version ที่ถูกต้องสำหรับโครงการนี้ และโบนัสก็คือไม่ต้องติดตั้ง maven ด้วยตนเอง วิธีการของคุณไม่เพียง แต่คิดถึงการแก้ปัญหารุ่น แต่ต้องใช้อีกหนึ่งเครื่องมือที่ติดตั้งในเครื่อง
สูงสุด

2
นอกจากนี้โปรดทราบว่าสิ่งนี้จะเมานต์ผู้ใช้ที่เป็นเจ้าของพื้นที่เก็บข้อมูล Maven ท้องถิ่นลงในอินสแตนซ์ของนักเทียบท่า โดยทั่วไปแล้วสิ่งนี้จะทำงานเป็นรูทดังนั้นสิ่งใดก็ตามที่เขียนโดยอินสแตนซ์ maven dockerized จะเป็นของรูทภายใต้ Linux สิ่งนี้ไม่เป็นที่พึงปรารถนา ฉันพบอินสแตนซ์ nexus การตั้งค่าอย่างถูกต้องซึ่งเข้าถึงได้จากอินสแตนซ์บิลด์บิลด์นั้นเจ็บปวดน้อยกว่าโดยเฉพาะถ้าคุณต้องการบิลด์ที่ทำซ้ำได้
Thorbjørn Ravn Andersen

เมื่อนานมาแล้ว แต่ฉันก็ยังชอบวิธีนี้อยู่ เกี่ยวกับเวอร์ชัน maven แท็กรูปภาพจะจัดเตรียมไว้ให้ (ดูที่หน้า maven ใน Docker Hub) สำหรับความเป็นเจ้าของรูทนั้นจะไม่เกิดขึ้นบนเดสก์ท็อปนักเทียบท่า แต่เกิดขึ้นในกล่อง Linux (และสร้างโหนดแน่นอน) เคล็ดลับเล็ก ๆ สามารถ "บังคับ" UID ปัจจุบันในกรณีนี้ (อาร์กิวเมนต์ -u) ดังนั้นจึงได้รับการจัดการปัญหา แต่ทั้งหมดหมายความว่าฉันพบว่าวิธีนี้มีลำดับความสำคัญดีกว่า นักเทียบท่าอยู่ทั่วไปทุกหนทุกแห่งโดยเฉพาะอย่างยิ่งในการสร้างโหนด
André

1
(ต่อ) การตั้งค่าและความคิดของเจนกินส์โรงเรียนเก่านำไปสู่เรื่องแบบนี้ เครื่องมือ CI / CD สมัยใหม่ทำในสิ่งที่ตรงกันข้าม: คุณเพียงแค่เลือกบิลด์คอนเทนเนอร์ แต่นั่นเป็นเพียงความคิดเห็นของฉัน
André
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.