mvnwおよびmvnw.cmdファイルの目的は何ですか?


257

私は春のブートアプリケーションを作成したとき、私は見ることができましたmvnwし、mvnw.cmdプロジェクトのルートにあるファイル。これら2つのファイルの目的は何ですか?

回答:


345

これらのファイルはMavenラッパーからのものです。Gradleラッパーと同様に機能します

これにより、パスにMavenがインストールされていなくても、Mavenプロジェクトを実行できます。見つからない場合は、正しいMavenバージョンをダウンロードします(デフォルトでは、ユーザーのホームディレクトリにある限り)。

このmvnwファイルはLinux(bash)mvnw.cmd用であり、Windows環境用です。


必要なすべてのMavenラッパーファイルを作成または更新するには、次のコマンドを実行します。

mvn -N io.takari:maven:wrapper

別のバージョンのmavenを使用するには、次のようにバージョンを指定できます。

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

コマンドの代わりに使用できるmvnwがプロジェクトにすでにある場合PATHは、どちらのコマンドにもmaven on (システム変数でmaven binへのパスを追加するPath)が必要です。./mvnwmvn


あなたの答えはとても役に立ちます。Mavenラッパーのドキュメントを確認します。同じ目的でmvn使用できましたが、Maven操作にはコマンドを使用してい./mvnwました。
shaunthomas999

2
答えてくれてありがとう。最初にプロジェクトを作成するときのように、これがいつ生成されるか説明できますか?依存関係やプラグインの削除など、pomに変更を加えると、ラインに沿って更新されますか?
アサンケ2017

1
そして、mvnw.cmdファイルを追加/コミットする必要がありますか?
jpganz18

はい、もちろん。これにより、mavenを追加でインストールしたり、PATHにインストールしたりすることなく、mavenビルドをすばやく実行できます。
ダッジ

1
回答にとても感謝しています。それは非常に役に立ちます。敬礼と再び感謝します。
ダニエルエルナンデス

26

コマンドmvnw~/.m2/wrapper、最初の使用時にデフォルトでダウンロードされるMavenを使用します。

Mavenを使用したURLは、次の各プロジェクトで指定されています.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手動で変更します。

Mavenを使用して最初からラッパーを生成するには(すでにPATH実行している必要があります。

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

5

Mavenのラッパーは、 Mavenの(またはすべてでMavenをインストールしたくないユーザーのための)の特定のバージョンを必要とするプロジェクトのための優れた選択肢です。オペレーティングシステムに多くのバージョンをインストールする代わりに、プロジェクト固有のラッパースクリプトを使用できます。

mvnw:完全にインストールされたMavenの代わりに使用される実行可能なUnixシェルスクリプト

mvnw.cmd:Windows環境用です


ユースケース

ラッパーは、次のようなさまざまなオペレーティングシステムで動作します。

  • Linux
  • OSX
  • ウィンドウズ
  • Solaris

その後、Unixシステムに対して次のような目標を実行できます。

./mvnw clean install

そして、バッチの次のコマンド:

./mvnw.cmd clean install

ラッパーのプロパティに指定されたMavenがない場合は、ダウンロードされ$USER_HOME/.m2/wrapper/distsてシステムのフォルダーにインストールされます。


Mavenラッパープラグイン

単純なSpring Bootプロジェクトで自動インストールを行うためのMavenラッパープラグイン

まず、プロジェクトのメインフォルダーに移動して、次のコマンドを実行する必要があります。

mvn -N io.takari:maven:wrapper

Mavenのバージョンを指定することもできます。

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

オプション-Nは-non-recursiveを意味するため、ラッパーは現在のディレクトリのメインプロジェクトにのみ適用され、サブモジュールには適用されません。


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
Mavenラッパーの非常に基本的な考え方は、このプロジェクト用の正しいバージョンのMavenを宣言することです。そしてボーナスは、Mavenを手動でインストールする必要性を回避することです。あなたのアプローチは、バージョンの問題を解決するのに失敗するだけでなく、ローカルにインストールされたツールをもう1つ必要とします。
最大

2
また、これにより、ユーザーが所有するローカルMavenリポジトリーがdockerインスタンスにマウントされます。通常、これはrootとして実行されるため、Docker化されたmavenインスタンスによって書き込まれたものはすべて、Linuxのrootによって所有されます。これは必ずしも望ましいことではありません。特に再現可能なビルドが必要な場合は、Dockerビルドインスタンスにアクセスできる適切に設定されたネクサスインスタンスの方が苦痛が少ないことがわかりました。
するThorbjörnRavnアンデルセン

それはずっと前のことですが、私はまだこの方法を好みます。Mavenバージョンについては、イメージタグが提供しています(Docker HubのMavenページをご覧ください)。ルートの所有権については、Dockerデスクトップでは発生しませんが、実際にはLinuxボックスで発生します(もちろん、ビルドノードでも発生します)。この場合、小さなトリックで現在のUIDを「強制」できるため(-u引数)、問題が処理されます。しかし、何と言っても、このアプローチは桁違いに優れています。とにかく、Dockerは、特にビルドノードで遍在しています。
アンドレ

1
(続く)昔ながらのジェンキンスのセットアップと考え方は、この種のことにつながります。最新のCI / CDツールはその逆です。ビルドコンテナーを選択するだけです。しかし、それは私の意見です。
アンドレ・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.