MavenでJavaプロジェクトをビルドするまで【macOS】
Javaを使用して「Hello, World」を表示する簡単なプロジェクトを作成し、Mavenでビルドするまでの手順を、macOS向けに説明します。
Mavenを使ってビルドする手順
Mavenのインストール
まず、Mavenをインストールします。Homebrewを使用してインストールできます。
brew install maven
インストールが完了したら、以下のコマンドでMavenが正しくインストールされているか確認します。
mvn -version
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: /opt/homebrew/Cellar/maven/3.9.9/libexec
Java version: 14.0.2, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
Default locale: en_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
これで、Mavenのバージョン情報が表示されればインストールは成功です。
Mavenプロジェクトの作成
次に、Mavenプロジェクトを作成します。Mavenには、プロジェクトを簡単に作成するためのテンプレート機能が備わっています。
ターミナルで、プロジェクトを作成したいディレクトリに移動し、以下のコマンドを実行します。
mvn archetype:generate -DgroupId=fun._101010 -DartifactId=helloworld -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
このコマンドの意味は以下の通りです:
- -DgroupId=fun._101010: グループID(パッケージの逆ドメイン名)
- -DartifactId=helloworld: プロジェクトの名前
- -DarchetypeArtifactId=maven-archetype-quickstart: シンプルなMavenプロジェクトのテンプレート
- -DinteractiveMode=false: 対話モードを無効にして、指定したオプションでプロジェクトを自動生成
プロジェクトディレクトリに移動
次に、作成されたプロジェクトのディレクトリに移動します。
cd helloworld
次のような構造で、プロジェクトが生成されてました。
tree
.
├── pom.xml
└── src
├── main
│ └── java
│ └── fun
│ └── _101010
│ └── App.java
└── test
└── java
└── fun
└── _101010
└── AppTest.java
Hello, World プログラムの作成
src/main/java/fun/_101010/App.javaというファイルが自動生成されています。このファイルに「Hello, World」を表示するコードが既に含まれていますが、確認しておきましょう。package fun._101010;
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello, World!" );
}
}
必要であれば、ファイルをテキストエディタで開いて、内容を確認・修正してください。
Mavenでビルドする
プロジェクトのディレクトリ内で以下のコマンドを実行して、Mavenでプロジェクトをビルドします。
mvn package
このコマンドを実行すると、Mavenがプロジェクトをコンパイルし、JARファイルをtargetディレクトリに生成します。
プログラムの実行
ビルドが成功したら、生成されたJARファイルを実行して「Hello, World」を表示します。
java -cp target/helloworld-1.0-SNAPSHOT.jar fun._101010.App
これでターミナルに「Hello, World!」と表示されれば成功です。
毎回クラスパスの指定をするのは面倒
java -cp target/helloworld-1.0-SNAPSHOT.jar fun._101010.App コマンドでJARファイルを実行する際、fun._101010.App の部分は実行したいクラスの「完全修飾名(fully qualified name)」を指定する必要があります。完全修飾名は、そのクラスが属しているパッケージ名を含むクラス名のことです。なぜ完全修飾名を指定するのか
Javaでは、同じ名前のクラスが異なるパッケージに存在する可能性があります。そのため、どのクラスを実行すべきかを明確に指定するために、パッケージ名を含めた完全修飾名を使用します。これにより、Javaはどのクラスを実行するかを正確に認識できます。
実行時の注意点
- クラスパスの指定: -cp オプションで指定したJARファイルがクラスパスとして使用されます。このクラスパス内にあるクラスを指定するために、完全修飾名が必要です。
- メインメソッドの存在: 実行しようとするクラスには、public static void main(String[] args) メソッドが必要です。このメソッドがエントリーポイントとなり、Javaプログラムが実行されます。
java -jar コマンドを使用する方法
もし、JARファイル自体に実行すべきクラスが指定されている場合は、java -jar コマンドを使用することで、パッケージ名を含むクラス名を指定せずにJARファイルを実行できます。
まず pom.xml ファイルに <build> セクションを追加し、その中に maven-jar-plugin を設定して、Main-Class を指定します。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fun._101010</groupId>
<artifactId>helloworld</artifactId>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>fun._101010.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
次に再度、Mavenでプロジェクトをビルドします。
mvn package
java -jar target/helloworld-1.0-SNAPSHOT.jar
Mavenのキャッシュ
Mavenを使って開発するとき、毎回ビルドするたびにすべての依存関係をダウンロードするわけではありません。以下の点を理解すると、Mavenの動作がより明確になります。
ローカルリポジトリのキャッシュ
Mavenは依存関係を一度ダウンロードすると、ローカルリポジトリ(通常、~/.m2/repository/に保存されます)にキャッシュします。そのため、同じ依存関係を持つ別のプロジェクトや、同じプロジェクトで再度ビルドする際には、既にダウンロードされた依存関係を再利用するため、再度ダウンロードされることはありません。
ビルド時間の短縮
- インクリメンタルビルド: Mavenはソースコードやリソースの変更があった部分だけを再コンパイルする機能を持っており、すべてを一からビルドするわけではありません。これにより、ビルド時間が短縮されます。
- キャッシュの再利用: 先述した通り、一度ダウンロードされた依存関係はキャッシュされるため、次回以降のビルド時に時間がかかりません。
依存関係の更新
Mavenはデフォルトでリリース済みの依存関係を更新しませんが、スナップショット版(開発中のバージョン)を利用している場合は、最新の依存関係を取得するためにリモートリポジトリを確認します。しかし、通常のリリース版を使用している場合は、必要がない限り再ダウンロードは行われません。
ビルドの高速化
- Maven Wrapper: プロジェクトごとにMavenのバージョンを固定し、ビルドの再現性を保つためのツールです。これにより、異なる環境間でのビルド時間を均一に保てます。
- 並列ビルド: 複数のモジュールを持つプロジェクトで、Mavenは並列ビルドをサポートしており、ビルド時間を短縮できます(-Tオプションを使用します)。
ビルドの最適化
- オフラインモード: Mavenは-oオプションを使用することで、オフラインモードでビルドを実行できます。これにより、インターネットに接続せずにローカルキャッシュを利用してビルドするため、ネットワークアクセスによる遅延が発生しません。
- インクリメンタルビルドツールの利用: JRebelやSpring Boot DevToolsなどのツールを使うことで、特に開発中のフィードバックループを短縮し、ビルドとデプロイの待ち時間を減らすことができます。