社内Proxy上でApache Mavenを実行する時の備忘録メモ

社内Proxyが有る環境でApache Maven(以下Maven)を動作させるのに苦労したのでProxy設定の方法を備忘録メモとしてまとめたいと思います。

# Apache Mavenとは？
Javaにおけるライブラリの管理、プロジェクトのビルド、テストの実行、デプロイ等を担うビルドツールです。C言語で言うところのGNU Makeに相当する物だと筆者は理解しています。

# 検証環境
Ubuntu 16.04.5 LTS

# Apache Mavenのインストール
Mavenをインストールします。今回の検証はUbuntuで実施しています。

```bash

sudo apt install -y maven
```

<details><summary>インストールが無事完了しているかの確認</summary><div>

```bash

$ mvn -v
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 9-internal, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-9-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-137-generic", arch: "amd64", family: "unix"
```

</div></details>


# Proxyの設定
社内Proxyの壁が立ちはだかっている場合```/etc/maven/settings.xml```を編集

```bash
sudo vim /etc/maven/settings.xml
```

<details><summary>記載例(必要部分を抜粋)</summary><div>

```bash

<!-- proxies
 | This is a list of proxies which can be used on this machine to connect to the network.
 | Unless otherwise specified (by system property or command-line switch), the first proxy | specification in this list marked as active will be used.
 |-->
<proxies>
  <!-- proxy
   | Specification for one proxy, to be used in connecting to the network.
   |-->
  <proxy>
    <id>http_proxy</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>USER_NAME</username>
    <password>PASSWD</password>
    <host>HOST</host>
    <port>PORT</port>
    <nonProxyHosts>NON_PROXY</nonProxyHosts>
  </proxy>
  <proxy>
    <id>https_proxy</id>
    <active>true</active>
    <protocol>https</protocol>
    <username>USER_NAME</username>
    <password>PASSWD</password>
    <host>HOST</host>
    <port>PORT</port>
    <nonProxyHosts>NON_PROXY</nonProxyHosts>
  </proxy>
</proxies>
```
</div></details>

# 動作確認
インストールしたMavenの動作確認をテストプロジェクトを作成して行います。Proxy設定が正しく完了出来ていない場合、実行エラーが発生し、Errorと大量に表示されます。

## テストプロジェクトの作成
Mavenプロジェクトを動作検証用に作成します。名前は`test-app`とします。

```bash
mvn archetype:generate
```

<details><summary>作成例</summary><div>

```bash

Choose archetype:
1: internal -> org.apache.maven.archetypes:maven-archetype-archetype (An archetype which contains a sample archetype.)
2: internal -> org.apache.maven.archetypes:maven-archetype-j2ee-simple (An archetype which contains a simplifed sample J2EE application.)
3: internal -> org.apache.maven.archetypes:maven-archetype-plugin (An archetype which contains a sample Maven plugin.)
4: internal -> org.apache.maven.archetypes:maven-archetype-plugin-site (An archetype which contains a sample Maven plugin site.
      This archetype can be layered upon an existing Maven plugin project.)
5: internal -> org.apache.maven.archetypes:maven-archetype-portlet (An archetype which contains a sample JSR-268 Portlet.)
6: internal -> org.apache.maven.archetypes:maven-archetype-profiles ()
7: internal -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
8: internal -> org.apache.maven.archetypes:maven-archetype-site (An archetype which contains a sample Maven site which demonstrates
      some of the supported document types like APT, XDoc, and FML and demonstrates how
      to i18n your site. This archetype can be layered upon an existing Maven project.)
9: internal -> org.apache.maven.archetypes:maven-archetype-site-simple (An archetype which contains a sample Maven site.)
10: internal -> org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:【デフォルトのままEnter】
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.pom (2 KB at 2.4 
KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/4/maven-archetype-bundles-4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/4/maven-archetype-bundles-4.pom (4 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetype/maven-archetype/2.0-alpha-5/maven-archetype-2.0-alpha-5.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetype/maven-archetype/2.0-alpha-5/maven-archetype-2.0-alpha-5.pom (9 KB at 32.5 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/16/maven-parent-16.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/16/maven-parent-16.pom (23 KB at 45.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar (7 KB at 23.9 KB/sec)
Define value for property 'groupId': com.test
Define value for property 'artifactId': test-app
Define value for property 'version' 1.0-SNAPSHOT: :【デフォルトのままEnter】
Define value for property 'package' com.test: :【デフォルトのままEnter】 
Confirm properties configuration:
groupId: com.test
artifactId: test-app
version: 1.0-SNAPSHOT
package: com.test
 Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/user
[INFO] Parameter: package, Value: com.test
[INFO] Parameter: groupId, Value: com.test
[INFO] Parameter: artifactId, Value: test-app
[INFO] Parameter: packageName, Value: com.test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/user/test-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:15 min
[INFO] Finished at: 2020-03-19T09:24:46+09:00
[INFO] Final Memory: 19M/64M
[INFO] ------------------------------------------------------------------------

```

</div></details>

参考: [社内でMaven実行時、外部のMavenリポジトリサーバーからダウンロードができない時の対処方法](https://qiita.com/nikuyoshi/items/567f78e07e5733907491)

# まとめ
試してみようと思ったOSSがJavaで実装されており、Mavenプロジェクトの状態で配布されていたため、Mavenをインストールしましたが、案の定社内Proxyに阻まれ最初はビルドもままなりませんでした。Proxy絡みの設定はアプリケーションによって異なるのでぶつかった時は解決次第メモとして残しておくことが必要だと思いました。

# Reference
[Javaビルドツール入門 Maven/Gradle/SBT/Bazel対応 (掌田 津耶乃著; 秀和システム; 2017年)](https://www.amazon.co.jp/Java80-Maven-Gradle-SBT-Bazel9C-ebook/dp/B079Z1PG6C/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1567397583&sr=8-1)
https://www.codeflow.site/ja/article/maven__how-to-install-maven-in-ubuntu