WindowsにMaven(Proxy経由/NEXUS経由)をインストールする方法

## 1. はじめに
Mavenはインターネットに公開されているMavenのCetralリポジトリ等にアクセスし、必要なライブラリを取得します。そのため、会社のネットワークなど**インターネットに直接アクセスできない環境では、ProxyかNEXUSを経由させる必要があります。**
今回はWindowsにMavenをインストールする方法と併せて、ProxyやNEXUSを経由させる方法について説明します。
なお、よく利用するMavenコマンドについては「[TERASOLUNA5.xで覚えるべきMavenコマンド](http://qiita.com/5zm/items/80464aa3698bb660bf5b)」を参照ください。

### 1.1. 検証環境
* Java 1.8.0_131
* Apache Maven 3.3.9
* Nexus Repository Manager OSS 2.x (2.14.4-03)

### 1.2. 作業の流れ

| 項番 | 内容 | 備考 |
|:----:|:----|:-----|
| 1 | [Mavenのダウンロードとインストール](#2-mavenのダウンロードとインストール) |MavenのインストールはZipファイルをダウンロードし、Zipファイルを展開するだけです。 |
| 2 | [環境変数の設定](#3-環境変数の設定) |Mavenコマンドを有効にするため環境変数を設定します。 |
| 3 | [setting.xmlの配置](#4-settingxmlの配置)|Mavenの設定ファイルであるsetting.xmlを作成して配置します。<br />インターネットのCentralリポジトリにアクセスする方法がいくつかあり、それぞれ設定方法が異なります。<br />1.Proxyを経由する方法 <br />2.NEXUSを経由する方法 |
| 4 | [動作確認](#5-動作確認) |設定が正しく行われていることを確認するためTERASOLUNA5.xのプロジェクトを作成してみます。 |

## 2. Mavenのダウンロードとインストール
Mavenの公式サイト https://maven.apache.org/ からZipファイルをダウンロードします。
インストールはZipファイルを展開するだけで完了です。
今回は`C:\tools`ディレクトリにインストール（展開）することとします。

## 3. 環境変数の設定
各自の環境に合わせて設定してください。

| 項番 | キー | 値 |
|:----:|:----|:---|
| 1 | JAVA_HOME | C:\Program Files\Java\jdk1.8.0_131 |
| 2 | MAVEN_HOME | C:\tools\apache-maven-3.3.9 |
| 3 | path | %JAVA_HOME%\bin と %MAVEN_HOME%\bin を追加 |

## 4. setting.xmlの配置
### 4.1. `C:\Users\ユーザ名\.m2`ディレクトリの作成
Mavenの設定ファイル（setting.xml）はユーザ単位で作成します。
格納先は`C:\Users\ユーザ名\.m2`ディレクトリになります。

残念ながらWindowsのエクスプローラ（GUI）では`.`で始まるディレクトリを作成することができません。コマンドプロンプトで`mkdir .m2`で作成してください。


### 4.2. ローカルリポジトリのディレクトリを変更する場合のsetting.xml
Mavenの設定として、ローカルリポジトリのディレクトリをデフォルトのユーザのホームディレクトリ配下から変更することをお勧めします。

**必要なライブラリが全部ローカルリポジトリに反映された後、Zipファイル等でアーカイブし、プロジェクトメンバに配布する**ことでローカルリポジトリの作成時間を短くすることができます。

| 項番 | ローカルリポジトリのディレクトリ | 内容 |
|:---:|:-------|:---------|
| 1 | `C:\Users\ユーザ名\.m2\repository` | デフォルト |
| 2 | `C:/tools/repository` | 変更例です<br />各自の環境に合わせてください |

```xml:setting.xml（ローカルリポジトリのディレクトリを変更する場合）
<settings>
  <localRepository>C:/tools/repository</localRepository>
</settings>
```

### 4.3. proxy経由のsetting.xml
proxyを経由してインターネットにアクセスするため、proxyの接続情報（IPアドレス、ポート番号等）を`setting.xml`に設定します。

| 項番 | タグ | 値 | 内容 |
|:----:|:---:|:---|:----|
| 1 | `<id>` |mavenProxy |・proxyの接続情報を識別するためのID<br />・任意の値で構わない |
| 2 | `<host>` |yourproxy.example.com |・proxyサーバのホスト名またはIPアドレス |
| 3 | `<port>` |8080 |・proxyサーバのポート番号 |
| 4 | `<username>` |proxyUserId |・認証情報のユーザID<br />・ユーザ認証が必要な場合に設定<br />・不要な場合はタグ自体記述不要 |
| 5 | `<password>` |proxyUserPassword |・認証情報のパスワード<br />・ユーザ認証が必要な場合に設定<br />・不要な場合はタグ自体記述不要 |
| 6 | `<nonProxyHosts>` | `localhost｜127.0.0.1｜10.*`<br />（正しい区切り文字は半角の｜） |・proxyを経由させないホストやIPアドレス |


```xml:setting.xml（proxy経由）
<settings>
  <localRepository>C:/tools/repository</localRepository>
  <proxies>
    <proxy>
      <id>mavenProxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>yourproxy.example.com</host>
      <port>8080</port>
      <username>proxyUserId</username>
      <password>proxyUserPassword</password>
      <nonProxyHosts>localhost|127.0.0.1|10.*</nonProxyHosts>
    </proxy>
  </proxies>
</settings>
```

### 4.4. NEXUS経由のsetting.xml
NEXUSを経由してインターネットにアクセスするため、NEXUSサーバのURLをsetting.xmlに設定します。
なお、NEXUSサーバの構築方法については別の機会に記事にしたいと思います。

| 項番 | タグ | 値 | 内容 |
|:----:|:---:|:---|:----|
| 1 | `<id>` |mynexus |・NEXUSサーバを識別するためのID<br />・任意の値で構わない |
| 2 | `<url>` |`http://mynexusserver:8081/nexus/content/groups/public` |・NEXUSサーバで公開しているリポジトリのURL<br />・NEXUSサーバの管理者に聞くこと |

```xml:setting.xml（NEXUS経由）
<settings>
  <localRepository>C:/tools/repository</localRepository>
  <mirrors>
    <mirror>
      <id>mynexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://mynexusserver:8081/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>mynexus</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>mynexus</activeProfile>
  </activeProfiles>
</settings>
```

## 5. 動作確認
TERASOLUNA5.xのガイドラインの「[3.1.2. 開発プロジェクトの作成](http://terasolunaorg.github.io/guideline/5.3.0.RELEASE/ja/ImplementationAtEachLayer/CreateWebApplicationProject.html#createwebapplicationproject)」で試しにプロジェクトを作成してみます。

```console:ガイドラインに記載のプロジェクトの作成例
mvn archetype:generate -B^
 -DarchetypeGroupId=org.terasoluna.gfw.blank^
 -DarchetypeArtifactId=terasoluna-gfw-multi-web-blank-mybatis3-archetype^
 -DarchetypeVersion=5.3.0.RELEASE^
 -DgroupId=com.example.todo^
 -DartifactId=todo^
 -Dversion=1.0.0-SNAPSHOT
```

```console:実行結果(NEXUS経由の場合)

C:\work>mvn archetype:generate -B^
More?  -DarchetypeGroupId=org.terasoluna.gfw.blank^
More?  -DarchetypeArtifactId=terasoluna-gfw-multi-web-blank-mybatis3-archetype^
More?  -DarchetypeVersion=5.3.0.RELEASE^
More?  -DgroupId=com.example.todo^
More?  -DartifactId=todo^
More?  -Dversion=1.0.0-SNAPSHOT
[INFO] Scanning for projects...
[INFO] Downloading: http://mynexusserver:8081/nexus/content/groups/public/org/codehaus/mojo/maven-metadata.xml
[INFO] Downloading: http://mynexusserver:8081/nexus/content/groups/public/org/apache/maven/plugins/maven-metadata.xml

... 省略 ...

[INFO] Using following parameters for creating project from Archetype: terasoluna-gfw-multi-web-blank-mybatis3-archetype
:5.3.0.RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.example.todo
[INFO] Parameter: artifactId, Value: todo
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: package, Value: com.example.todo
[INFO] Parameter: packageInPathFormat, Value: com/example/todo
[INFO] Parameter: package, Value: com.example.todo
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.example.todo
[INFO] Parameter: artifactId, Value: todo
[INFO] Parent element not overwritten in C:\work\todo\todo-env\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-domain\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-web\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-initdb\pom.xml
[INFO] Parent element not overwritten in C:\work\todo\todo-selenium\pom.xml
[INFO] Project created from Archetype in dir: C:\work\todo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 31.169 s
[INFO] Finished at: 2017-09-05T20:32:37+09:00
[INFO] Final Memory: 10M/28M
[INFO] ------------------------------------------------------------------------

C:\work>
```

NEXUS経由の場合、`[INFO] Downloading: http://mynexusserver:8081/nexus/content/groups/public/org/codehaus/mojo/maven-metadata.xml
`のようにダウンロード先のURLがNEXUSサーバになっていることが分かります。

## 6. さいごに
今回はWindows上にMavenをインストールする方法と、Proxyを経由させる設定やNEXUSを経由させる設定について説明しました。
少人数のプロジェクトでは各個人がProxyを経由する方法でも構いません問題はありませんが、大規模なプロジェクトではNEXUSのキャッシュが有効になるNEXUSを経由させることをお勧めします。