Java7 環境で maven が失敗する (Received fatal alert: protocol_version)


2018/06/18 以降、Java7 環境で ``mvn clean package`` とかすると、[Maven Central Repository] に通信できなくて失敗してます。


## Java7 環境

例えばこんな環境です。 (Java7 の Windows Server 2008R2 環境でした。古い...)

```
> mvn --version

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T03:41:47+09:00)
Maven home: C:\apache-maven-3.6.0\bin\..
Java version: 1.7.0_75, vendor: Oracle Corporation, runtime: C:\Program Files (x86)\xxxxxx\jdk\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows server 2008 r2", version: "6.1", arch: "x86", family: "windows"
```


## mvn clean してみる

必要な maven plugin ``maven-clean-plugin:2.5`` を [Maven Central Repository] に取りに行ってくれてますが、``[ERROR] ... Received fatal alert: protocol_version`` でエラー死してます。

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.805 s
[INFO] Finished at: 2018-12-14T11:46:23+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5: Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to central (https://repo.maven.apache.org/maven2): Received fatal alert: protocol_version -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginResolutionException
```

ここで言ってる ``Received fatal alert: protocol_version`` とは、 **「あなた TLSv1.0 でアクセスして来たけど、私達 TLSv1.2 しかサポートしてないよ」** という意味です。


## Maven Central Repository は TLSv1.2 のみ？

2018/06/18 から、TLSv1.0, TLSv1.1 はサポートなしに変えた様です。

* [Discontinued support for TLSv1.1 and below]


## Java7 は TLSv1.0 ?

Java7 では、標準で暗号化プロトコル TLSv1.0, TLSV1.1, TLSv1.2 のサポートがされています。
サポートはされていますが、 **Java7 が default で使用するのは TLSv1.0** に設定されています。

* [Diagnosing TLS, SSL, and HTTPS]

なので、JVMの設定やソースコードで明示的に指定しない限り、Java7 では TLSv1.0 を使っちゃいます。

> Java アプリが使っている http client library の仕様等にも依るので、一概に Java7 --> default TLSv1.0 とは言えません。注意。

## 解決策

正攻法はこうです。JVM の起動オプションに ``-Dhttps.protocols=TLSv1.2`` をつけます。

```
mvn -Dhttps.protocols=TLSv1.2 clean
```

## 解決策 (Windows 黒魔術)

Windows の場合は、``mvn`` コマンドはバッチファイルになってますので、直接書き換えて **(=黒魔術)** 対応できます。

```
# ↓ のパスは例えば〜です。自分で配置した所に読み替えて下さい。
C:\apache-maven-3.6.0\bin\mvn.cmd
```

java コマンドを実行している箇所があるので、そこに JVM オプションを追加してやります。

```diff
 "%JAVACMD%" ^
   %JVM_CONFIG_MAVEN_PROPS% ^
   %MAVEN_OPTS% ^
   %MAVEN_DEBUG_OPTS% ^
   -classpath %CLASSWORLDS_JAR% ^
   "-Dclassworlds.conf=%MAVEN_HOME%\bin\m2.conf" ^
   "-Dmaven.home=%MAVEN_HOME%" ^
   "-Dlibrary.jansi.path=%MAVEN_HOME%\lib\jansi-native" ^
   "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+  "-Dhttps.protocols=TLSv1.2" ^
   %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
```


## 参考

* [stackoverflow]


[Maven Central Repository]:https://mvnrepository.com/repos/central
[stackoverflow]:https://stackoverflow.com/questions/50824789/why-am-i-getting-received-fatal-alert-protocol-version-or-peer-not-authentic
[Discontinued support for TLSv1.1 and below]:https://central.sonatype.org/articles/2018/May/04/discontinued-support-for-tlsv11-and-below/?__hstc=31049440.0aad5c9cfd27c5f13b73db2469765ccb.1544756465808.1544756465808.1544756465808.1&__hssc=31049440.3.1544756465808&__hsfp=1620480057
[Diagnosing TLS, SSL, and HTTPS]:https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https