Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

mvn installとmvn packageの違いは?

mvn installとmvn packageの違いは何でしょう?

mvn installとmvn packageは、Mavenビルドツールで実行できる2つのタスクですが用途が異なります。

mvn install

mvn installは、プロジェクトのビルド、テスト、パッケージ化を行い、プロジェクトをローカルのMavenリポジトリにインストールします。
これにより、同じローカル環境で別のプロジェクトからこのプロジェクトを参照できるようになります。

mvn package

mvn packageは、プロジェクトのビルド、テスト、パッケージ化を行い、targetディレクトリにjarファイルやwarファイルなどのアーティファクトを生成しますが、ローカルリポジトリにはインストールしません。
これは、他のプロジェクトで依存関係を解決するために使用する必要がない場合に便利です。

つまり、mvn installは、プロジェクトの依存関係を解決するために他のプロジェクトから利用できるようにするために使用され、mvn packageは、アーティファクトを生成するだけで、他のプロジェクトから利用する必要がない場合に使用されます。

mavenのマルチプロジェクトの場合はmvn installして他のプロジェクトからも参照できるようにする必要がありますね。

mvn installでtargetディレクトリは生成されるのか

mvn installコマンドを実行すると、Mavenプロジェクトのルートディレクトリにtargetディレクトリが生成されます。

Mavenでは、ビルドプロセス中に生成されるファイルやディレクトリをtargetディレクトリに格納します。
このディレクトリには、コンパイルされたクラスファイル、パッケージ化されたアーティファクト(例:JARファイルやWARファイル)、テストの結果などが含まれます。

以下は、mvn installコマンドの一般的な流れです:

1. コンパイル:
ソースコードをコンパイルし、コンパイル済みのクラスファイルをtarget/classesディレクトリに生成します。

2. テスト:
ユニットテストを実行し、テスト結果をtarget/test-classesやtarget/surefire-reportsディレクトリに保存します。

3. パッケージング:
アーティファクト(通常はJARファイル)をtargetディレクトリに生成します。

4. インストール:
生成されたアーティファクトをローカルリポジトリ(通常は~/.m2/repository)にインストールします。

例えば、次のようなディレクトリ構造が生成されます:

my-project/
├── pom.xml
├── src/
└── target/
  ├── classes/
  ├── my-project-1.0-SNAPSHOT.jar
  ├── test-classes/
  └── surefire-reports/

このように、mvn installコマンドを実行することで、自動的にtargetディレクトリが生成され、ビルド成果物やテスト結果が格納されます。