CLOVER🍀

That was when it all began.

Maven Wrapper(mvnw)を使って、Maven未インストール環境でもMavenを使えるようにする

使われているのはけっこう見てきているのですが、いい加減に自分でも使ってみようかと思い、Maven Wrapperを試して
みることにしました。

Maven Wrapperは、Gradle Wrapperにインスパイアされたものらしいです。

第62章 Gradleラッパー

Gradle Wrapperなら「gradlew」、Maven Wrapperなら「mvnw」というスクリプトを使用して、それぞれGradle、Mavenを自動的にダウンロードしてきて
各ビルドができるためにするものです。

これを使うと、各開発者の環境にMavenやGradleをインストールしておく必要がなくなります(スクリプトでダウンロードする)。

まあ、ふだんはMavenをインストールしている環境にいるので、あんまり気にしたことはなかったのですが、1度は試しておこうかなぁと。

Maven Wrapper

Maven Wrapper自体は、こちら。

GitHub - takari/maven-wrapper: The easiest way to integrate Maven into your project!

特にSystem Requirements的なものは書いていませんが、たぶんJavaがインストールされていれば動くんでしょう…。

サポートしているOSは、

だそうな。

使ってみる

Maven Wrapperを使うには、既存のMavenプロジェクト上で、以下のコマンドを実行するようです。

$ mvn -N io.takari:maven:wrapper

なので、このコマンドを実行する環境には、Mavenがインストールされている必要がありますね…。

コマンドを実行すると、プロジェクトのディレクトリに「mvnw」、「mvnw.cmd」スクリプトおよび、「.mvn」ディレクトリが作成されます。
中身は、こんな感じ。

$ find mvnw* .mvn -type f
mvnw
mvnw.cmd
.mvn/wrapper/maven-wrapper.properties
.mvn/wrapper/maven-wrapper.jar

利用側は、通常の「mvn」コマンドの代わりに、次のように「mvnw」スクリプトを使用します。

$ ./mvnw clean test

Windowsの場合は、「mvnw.cmd」ですね。

mvnw.cmd clean test

ところで、「mvn -N io.takari:maven:wrapper」を使用すると、コマンド実行時の最新のMavenを対象とするスクリプトが作成されるらしいのですが、
Mavenのバージョンを指定する場合は次のコマンドを実行するそうな。

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

途中でのMavenバージョン表示が、このようになります。

[INFO] Using Apache Maven 3.3.3

もうちょっとスクリプトの中身を

一応、作成されたファイルの中身を押さえておきましょうか。

ポイントは、「.mvn」ディレクトリにあるプロパティファイルな気がするので、ちょっと見てみましょう。
.mvn/wrapper/maven-wrapper.properties

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

これを、「-Dmaven=3.3.3」のようにバージョン指定すると、次のようなプロパティファイルが作成されます。
.mvn/wrapper/maven-wrapper.properties

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

これで取ってくるMavenのバージョンが決まるわけですね。

あと、プロキシ環境下で使う場合とかがちょっと気になるわけですが、これを見ていると
https://github.com/takari/maven-wrapper/blob/master/src/main/java/org/apache/maven/wrapper/DefaultDownloader.java#L68-L73
https://github.com/takari/maven-wrapper/blob/master/mvnw#L223-L227

「mvnw」コマンドを実行する前に環境変数「MAVEN_OPTS」に、「-Dhttps.proxyHost」や「-Dhttps.proxyPort」、「-Djava.net.useSystemProxies」あたりを
指定して実行すれば良さそうですね。

覚えておきましょう。