Mục đích của các tập tin mvnw và mvnw.cmd là gì?


257

Khi tôi tạo một ứng dụng Spring Boot, tôi có thể thấy mvnwmvnw.cmdcác tập tin trong thư mục gốc của dự án. Mục đích của hai tập tin này là gì?

Câu trả lời:


345

Những tập tin này là từ Maven Wrapper . Nó hoạt động tương tự như trình bao bọc Gradle .

Điều này cho phép bạn chạy dự án Maven mà không cần cài đặt và trình bày Maven trên đường dẫn. Nó tải xuống phiên bản Maven chính xác nếu không tìm thấy (theo như tôi biết theo mặc định trong thư mục nhà người dùng của bạn).

Các mvnwtập tin là dành cho Linux (bash) và mvnw.cmdlà cho môi trường Windows.


Để tạo hoặc cập nhật tất cả các tệp Maven Wrapper cần thiết thực hiện lệnh sau:

mvn -N io.takari:maven:wrapper

Để sử dụng phiên bản maven khác, bạn có thể chỉ định phiên bản như sau:

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

Cả hai lệnh yêu cầu maven trên PATH(thêm đường dẫn đến maven binđể Pathvào System Variables) nếu bạn đã có mvnw trong dự án của bạn, bạn có thể sử dụng ./mvnwthay vì mvntrong các lệnh.


Câu trả lời của bạn rất hữu ích. Tôi kiểm tra tài liệu bao bọc maven. Tôi đã sử dụng mvnlệnh cho hoạt động maven mặc dù tôi có thể sử dụng ./mvnwcho cùng một mục đích.
shaunthomas999

2
Cảm ơn câu trả lời. Bạn có thể giải thích khi điều này được tạo ra, giống như khi bạn ban đầu tạo một dự án? Nó sẽ được cập nhật dọc theo dòng khi bạn thay đổi pom của mình như thêm phụ thuộc loại bỏ / bổ trợ?
Asanke

1
và, bạn có nên thêm / cam kết các tệp mvnw.cmd không?
jpganz18

Phải, tất nhiên. nó cho phép bạn nhanh chóng chạy bản dựng maven của mình mà không cần cài đặt thêm maven hoặc cài đặt nó trên PATH.
Dodge

1
Rất cám ơn về câu trả lời, nó rất hữu ích Bạn có thể cho chúng tôi biết đôi điều về tính di động của các tệp cài đặt maven khi chúng tôi làm việc theo cách đó không? Saludos và cảm ơn một lần nữa.
Daniel Hernández

26

Lệnh mvnwsử dụng Maven theo mặc định được tải xuống ~/.m2/wrappertrong lần sử dụng đầu tiên.

URL với Maven được chỉ định trong mỗi dự án tại .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

Để cập nhật hoặc thay đổi phiên bản Maven, hãy gọi các mục sau (nhớ về --non-recursivecác dự án đa mô-đun):

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

hoặc chỉ sửa đổi .mvn/wrapper/maven-wrapper.propertiesbằng tay.

Để tạo trình bao bọc từ đầu bằng Maven (bạn cần phải PATHchạy nó:

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

5

Các Maven Wrapper là một sự lựa chọn tuyệt vời cho các dự án mà cần một phiên bản cụ thể của Maven (hoặc cho người dùng không muốn cài đặt Maven ở tất cả). Thay vì cài đặt nhiều phiên bản của nó trong hệ điều hành, chúng ta chỉ có thể sử dụng tập lệnh trình bao bọc dành riêng cho dự án.

mvnw: đó là tập lệnh shell Unix thực thi được sử dụng thay cho Maven được cài đặt đầy đủ

mvnw.cmd : nó dành cho môi trường Windows


Trường hợp sử dụng

Trình bao bọc nên hoạt động với các hệ điều hành khác nhau, chẳng hạn như:

  • Linux
  • OSX
  • các cửa sổ
  • Solaris

Sau đó, chúng ta có thể chạy các mục tiêu của mình như thế này cho hệ thống Unix:

./mvnw clean install

Và lệnh sau cho Batch:

./mvnw.cmd clean install

Nếu chúng ta không có Maven được chỉ định trong thuộc tính trình bao bọc, nó sẽ được tải xuống và cài đặt trong thư mục $USER_HOME/.m2/wrapper/distscủa hệ thống.


Plugin Maven Wrapper

Plugin Maven Wrapper để cài đặt tự động trong dự án Spring Boot đơn giản.

Đầu tiên, chúng ta cần vào thư mục chính của dự án và chạy lệnh này:

mvn -N io.takari:maven:wrapper

Chúng tôi cũng có thể chỉ định phiên bản của Maven:

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

Tùy chọn -N có nghĩa là đệ quy-đệ quy để trình bao bọc sẽ chỉ được áp dụng cho dự án chính của thư mục hiện tại, không phải trong bất kỳ mô hình con nào.


2

Cho đến nay, tùy chọn tốt nhất hiện nay sẽ là sử dụng thùng chứa maven làm công cụ xây dựng. Một mvn.shkịch bản như thế này là đủ:

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

7
Điều này không trả lời câu hỏi OP, nó chỉ gợi ý một cách khác
ahmedjaad

2
Ý tưởng rất cơ bản của maven Wrapper là khai báo phiên bản chính xác của maven cho dự án này. Và một phần thưởng là tránh sự cần thiết phải cài đặt thủ công maven. Cách tiếp cận của bạn không chỉ bỏ lỡ để giải quyết vấn đề phiên bản mà còn yêu cầu thêm một công cụ được cài đặt cục bộ.
Tối đa

2
Cũng lưu ý rằng điều này gắn kết người dùng sở hữu kho lưu trữ Maven cục bộ vào ví dụ docker. Thông thường, cái này chạy dưới quyền root, do đó, bất cứ thứ gì được viết bởi cá thể maven dockerized đều thuộc sở hữu của root trong Linux. Điều này không nhất thiết là mong muốn. Tôi thấy một phiên bản nexus thiết lập đúng có thể truy cập vào đối tượng xây dựng docker ít gây đau đớn hơn, đặc biệt nếu bạn muốn các bản dựng có thể lặp lại.
Thorbjørn Ravn Andersen

Đó là một thời gian dài trước đây, nhưng tôi vẫn thích cách này. Về phiên bản maven, thẻ hình ảnh cung cấp cho nó (chỉ cần nhìn vào trang maven trong Docker Hub). Đối với quyền sở hữu gốc, điều đó không xảy ra trên máy tính để bàn docker - nhưng thực sự xảy ra trong các hộp linux (và tất nhiên là xây dựng các nút). Một mẹo nhỏ có thể "buộc" UID hiện tại trong trường hợp này (đối số -u), vì vậy vấn đề được xử lý. Nhưng tất cả có nghĩa là tôi thấy cách tiếp cận này có độ lớn tốt hơn. Docker dù sao cũng có mặt khắp nơi, đặc biệt là về các nút xây dựng.
André

1
(tiếp tục) Thiết lập và tư duy Jenkins của trường học cũ dẫn đến loại điều này. Các công cụ CI / CD hiện đại làm ngược lại: bạn chỉ cần chọn một thùng chứa bản dựng. Nhưng đó chỉ là ý kiến ​​của tôi.
André
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.