どうも、Shinyaです。
この記事では、Homebrewを使用してJavaのビルドツールとして定番のApache Mavenを簡単にインストールする方法について書いていきます。

Apache Mavenは、Java開発を行う際にデファクトスタンダードとなっているビルドツールです。一般的には単純に「Maven」と呼ばれることが多いので、この記事でもこれ以降はMavenと呼びます。
Mavenの優れている点は、使用するライブラリなどの依存性を「POM」と呼ばれるXML形式のファイルで簡単かつ一元的に管理できることです。
Maven登場以前のJavaでは、使用するライブラリのJarを自分でダウンロードしてローカルまたはサーバーの特定のフォルダに直接配置し、それらをひとつひとつJavaプロジェクトのクラスパスに手動で追加してあげる必要がありました。こうした作業の都合上、プロジェクトの規模がスケールアップすればするほど依存関係が複雑になり、ライブラリを配置するフォルダ構造が悪いとプロジェクトの管理が困難になることもありました。また、開発者の熟練度によってはこうした煩雑な作業を正しく行えない問題もありました。
こうした問題に一元的な標準を導入することでJavaのビルド管理に秩序を与えたのがMavenになります。Mavenを使用すると、誰でも簡単にXML形式で依存性の管理を行うことができ、ライブラリのダウンロードからクラスパスへの追加までコンパイル時に自動でやってくれるので、開発者は煩雑な依存性の管理から開放されて開発だけに集中することができます。
事前準備
この記事ではMavenをインストールする際にパッケージ管理ツールのHomebrewを使用します。そのため、Homebrewのインストールが終わっていない方は、以下の記事を参考にHomebrewをインストールしてください。
また、インストールしたMavenの動作確認を行うためには、Javaの開発環境としてJDKが必要になります。そのため、JDKのインストールが完了していない方は、以下の記事を参考にOpenJDKのAmazon Corettoをインストールしてみてください。
Mavenをインストールする
それでは早速、Homebrewを使用してMavenをインストールしていきます。
MavenはHomebrewでは「maven」という名前でパッケージが登録されているので、コマンドラインで次のbrew
コマンドを実行します。
brew install maven
上記のbrew
コマンドを実行するとMavenのインストールが始まりますので完了まで待機します。次のような画像の状態になれば、Mavenのインストールは完了です。

次にインストールしたMavenが使用できるようなっているか動作確認してみましょう。コマンドラインで次のmvn
コマンドを実行してください。
mvn --version
上記のコマンドを実行して、次の画像のようにインストールしたMavenのバージョン情報が出力されればインストールは問題なく完了しています。

Mavenを使ってビルドしてみる
せっかくMavenをインストールしたので、簡単なJavaのMavenプロジェクトを作成してビルドをしてみましょう。
Mavenプロジェクトを作成
検証用に次のようなMavenプロジェクトを作成しました。

この記事ではMavenプロジェクトの新規作成方法については詳しく触れませんが、先日VSCodeを使用してJavaの開発環境を構築する記事でMavenプロジェクトを作成していますので参考にしてみてください。
POMファイルに依存性を追加する
Mavenプロジェクトでは、「POM」と呼ばれるXMLファイルにビルドに関する定義を行っていきます。また、Mavenプロジェクトを作成した際に、Mavenプロジェクトの直下に「pom.xml」というファイルが生成されていますので、このファイルに依存性を追加してみましょう。
Mavenなどのビルドツールを使用して依存性を追加する際には、Maven Repositoryを使用して利用可能なライブラリを簡単に調べることができます。
今回は試しにApache Commons Langの依存性を追加してみます。pom.xmlの中にあるdependencies
タグの中に、次のdependencyタグを追加してください。
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.17.0</version>
</dependency>
pom.xmlに上記の依存性を追加した後は次のような状態になっています。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dev.shinyakato</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.17.0</version>
</dependency>
</dependencies>
</project>
Mavenでビルドを実行する
次に、POMファイルに追加したライブラリをダウンロードするために、pom.xmlがあるディレクトリでコマンドラインから次のmvn
コマンドを実行します。
mvn clean install
上記のコマンドは、「mvn clean
」と「mvn install
」を順番に実行します。
このコマンドでやっていることはとても単純で、「mvn clean
」で前回ビルドした際に生成されたtargetフォルダのデータを一度削除して、その後に「mvn install
」でビルドを行いtargetフォルダにビルドデータを生成しています。
上記のコマンドを実行すると以下のような出力結果を確認できます。
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< dev.shinyakato:demo >-------------------------
[INFO] Building demo 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.pom (31 kB at 53 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/73/commons-parent-73.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/73/commons-parent-73.pom (78 kB at 441 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar (674 kB at 2.7 MB/s)
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ demo ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/42/commons-parent-42.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/42/commons-parent-42.pom (68 kB at 772 kB/s)
[INFO] Deleting /path/demo/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ demo ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom (79 kB at 834 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.pom (31 kB at 348 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar (587 kB at 3.7 MB/s)
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.13.0:compile (default-compile) @ demo ---
[INFO] Recompiling the module because of changed source code.
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 17] to target/classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ demo ---
[INFO] skip non existing resourceDirectory /path/demo/src/test/resources
[INFO]
[INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ demo ---
[INFO] Recompiling the module because of changed dependency.
[INFO]
[INFO] --- surefire:3.2.5:test (default-test) @ demo ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/65/commons-parent-65.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/65/commons-parent-65.pom (78 kB at 847 kB/s)
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ demo ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/69/commons-parent-69.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/69/commons-parent-69.pom (77 kB at 802 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.pom (22 kB at 249 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/66/commons-parent-66.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/66/commons-parent-66.pom (77 kB at 856 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.pom (31 kB at 351 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/64/commons-parent-64.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/64/commons-parent-64.pom (78 kB at 821 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.jar (1.1 MB at 5.7 MB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar (658 kB at 4.3 MB/s)
[INFO] Building jar: /path/demo/target/demo-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- install:3.1.2:install (default-install) @ demo ---
[INFO] Installing /path/demo/pom.xml to /path/.m2/repository/dev/shinyakato/demo/1.0-SNAPSHOT/demo-1.0-SNAPSHOT.pom
[INFO] Installing /path/demo/target/demo-1.0-SNAPSHOT.jar to /path/.m2/repository/dev/shinyakato/demo/1.0-SNAPSHOT/demo-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.329 s
[INFO] Finished at: yyyy-MM-dd
[INFO] ------------------------------------------------------------------------
Mavenによるビルドが成功し、pom.xmlに追加したライブラリもMaven Repositoryからダウンロードできたことを確認できました。
ダウンロードしたライブラリを使って動作確認してみる
それでは、最後に本当にダウンロードしたライブラリが使用できるようになっているか確認してみましょう。
先ほど新規作成したJavaプログラムを次のように修正しました。
package dev.shinyakato;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
System.out.println(StringUtils.join("Hello", " ", "World", "!"));
}
}
次に、修正したプログラムを反映したJarが必要なので、もう一度以下のmvn
コマンドを実行してください。
mvn clean install
ビルドが完了したら、Mavenプロジェクト直下のtargetフォルダに最新のJarが生成されますので、次のコマンドを実行してJavaプログラムを実行してみます。
java -cp target/demo-1.0-SNAPSHOT.jar dev.shinyakato.Main
そうすると、次のようにダウンロードしたライブラリを使用してJavaプログラムを実行できることを確認できます。
