Mavenでプロジェクト毎にローカルリポジトリを切り替える方法

## 1. はじめに

これまで、Maven で複数のプロジェクトにおいて異なるローカルリポジトリや依存関係を利用する際、プロジェクトごとに `.m2/repository_sample` といったディレクトリを用意し、都度そのディレクトリを `.m2/repository` にリネームして切り替えていました。

しかし、この方法は手動での操作が煩雑な上、今どのMavenリポジドリがアクティブなのか気にする必要があり、とてもストレスでした。

そこで、どうにかこの課題を解決できないかと調査した結果、`settings.xml` を活用する方法が有効であると分かりました。
この記事では、その方法を備忘録としてまとめます。

## 2. Maven の settings.xml について
Maven には大きく分けて 2 つの `settings.xml` があります。

- **グローバル settings.xml**  
Maven インストールディレクトリ内の `conf/settings.xml` に存在し、全体に共通の設定が記述できます。

- **ユーザー settings.xml**  
通常はユーザーのホームディレクトリ（Windows では `C:\Users\<ユーザー名>\.m2\settings.xml`）に存在します。初期状態では存在しない場合が多いため、必要に応じて自分で作成します。

また、プロジェクトごとにカスタム設定を適用したい場合、`settings.xml` を別ファイルとして作成し、実行時にそのファイルを指定する方法が利用できます。

## 3. プロジェクトごとのローカルリポジトリ設定ファイルの作成
例えば、プロジェクト専用のリポジトリとして `repository_sample` を使用する場合、以下のような内容の設定ファイル（例: `sample_settings.xml`）を作成します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"                 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- ローカルリポジトリのパスを指定（絶対パスを推奨） -->
  <localRepository>C:/Users/[ユーザー名]/.m2/repository_sample</localRepository>
  
  <!-- 必要に応じて、プロキシ、ミラー、サーバ認証情報などの設定を追加できます -->
</settings>
```
このファイルをプロジェクト内や共通の設定ディレクトリに配置し、Maven 実行時に指定することで、該当プロジェクトではこのローカルリポジトリを使用できます。

## 4. コマンドラインからの実行方法
コマンドラインでカスタムの `settings.xml` を指定して Maven を実行する場合は、`-s` オプションを使用します。
例えば、プロファイル `stg` を有効にしてパッケージ化する場合、以下のように実行します。

```sh
mvn -s sample_settings.xml package -P stg
```
※ 設定ファイルは絶対パスで指定しても問題ありません。

このコマンドにより、Maven はデフォルトの `~/.m2/settings.xml` の代わりに `sample_settings.xml` 内の設定を読み込み、指定されたローカルリポジトリ（この例では `repository_sample`）が使用されます。

## 5. IntelliJ IDEA での設定方法
普段 IntelliJ IDEA を使用して開発しているため、IntelliJ 内でもプロジェクトごとにカスタムの `settings.xml` を利用して Maven を実行できるような設定を行いました。

### 5.1. Maven のグローバル設定の変更
1. **IntelliJ の設定画面を開く**
メニューから「ファイル」→「設定」を選択します。
2. **Maven の設定を確認する**
左側のメニューから「ビルド、実行、デプロイ」→「ビルドツール」→「Maven」を選択します。
3. **Custom settings.xml の指定**
「ユーザー設定ファイル」の欄に、使用したいカスタム `settings.xml`（この場合は `sample_settings.xml`）のパスを入力します。
これにより、IntelliJ 内で Maven を実行する際に、指定した設定ファイルが使用されます。
![スクリーンショット 2025-03-10 212349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687993/7a4e2e50-7599-4d85-9aa2-d07bc523739c.png)


### 5.2. Run/Debug Configuration での指定
1. **Run/Debug Configuration の編集**
メニューから「実行」→「実行構成の編集(R)...」を選択します。
2. **Maven 実行構成の作成または編集**
既存の Maven 実行構成を選択するか、新規作成します。
3. **VM Options / Command-line Options に設定**
必要に応じて、`-P stg` やその他のオプション（例: `-Dmaven.repo.local`）を追加できます。
通常、`settings.xml` にリポジトリの設定を記述している場合、追加のオプションは不要です。\
また、個別に使用するユーザー設定を切り替えたい場合は、「Maven オプション」→「設定から継承」のチェックボックスを外し、個別に `settings.xml` を指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687993/2b8bbb71-91f8-448b-9009-43e36aebe0b7.png)

これらの設定により、IntelliJ IDEA から Maven のビルドを実行した場合でも、カスタムの settings.xml に記載されたリポジトリ設定が適用されます。

## 6. まとめ
プロジェクトごとにリポジトリ名を分けるためには、カスタムの `settings.xml`（例: `sample_settings.xml`）を作成し、以下の方法で利用します。

コマンドラインの場合:
```sh
mvn -s sample_settings.xml package -P stg
```
IntelliJ IDEA の場合:
Maven のユーザー設定で `sample_settings.xml` のパスを指定するか、Run/Debug Configuration で適切なオプションを設定する。

これにより、プロジェクト固有の依存関係キャッシュ管理や環境構築が容易になり、ビルド時にどのリポジトリがアクティブかを気にする必要がなくなりました。

## 7. 参考情報
- [Maven 公式 – Settings Reference](https://maven.apache.org/settings.html)
Maven の設定ファイルの書き方や各種設定項目について記載されています。

- [IntelliJ IDEA – Maven](https://pleiades.io/help/idea/maven-support.html)
IntelliJ IDEA での Maven プロジェクトの取り扱い方法について解説されています。

## 8. 追記
最初は、ターミナルから実行する際に直接

```sh
mvn -Dmaven.repo.local="C:/Users/xxxx/repository_sample" -P dev clean package
```
のように指定できるのではないかと思っていましたが、うまくいかず…。
そのため、今回のように `settings.xml` を活用する方法を採用しました。