mvn installとmvn packageの違いは?

mvn installとmvn packageの違い

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

mvn install

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

/Users/ユーザー名/.m2/repository

mvn package

mvn packageは、プロジェクトのビルド、テスト、パッケージ化を行い、targetディレクトリにjarファイルやwarファイルなどのアーティファクトを生成しますが、ローカルリポジトリにはインストールされません。
他のプロジェクトから参照されない場合(依存関係がない場合)に使用されます。

まとめ

mvn install
プロジェクトの依存関係を解決するために他のプロジェクトから利用できるようにするために使用される。

mvn package
アーティファクトを生成するだけで、他のプロジェクトから利用する必要がない場合に使用される。

※mavenのマルチプロジェクトの場合は、他のプロジェクトとの依存関係が発生するため、mvn installをする必要がありますね。

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

mvn installコマンドを実行すると、maven packageの場合と同様にMavenプロジェクトのルートディレクトリにtargetディレクトリが生成され、ビルドプロセス中に生成されるファイルやディレクトリが格納されます。

以下は、mvn installコマンドの一般的な流れです。
あくまで一般なので、スキップ可能なステップもあります。

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

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

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

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

例として、パッケージングでは次のようなディレクトリ構造が生成され、target以下はローカルリポジトリにも保存されます。

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

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