MacにOpenJDKをインストールする（2019年現在）

## 概要

2019年現在、以前とまでと違いJDKのライセンス形態がアップデートされ、簡単にJDKをインストールすることができなくなりました。

* [「Oracle Java」のライセンスが変更 ～無償利用は個人での開発・テスト・デモ目的のみに](https://forest.watch.impress.co.jp/docs/news/1180607.html)

そのため、「Mac JDK Install」などでググって環境構築する入門者たちはとてもつまづきやすいのではないかと感じ、個人的にも毎回ググって共有することが手間になってきたため手順をまとめることにする。


## 前提

MacユーザーがJDKを必要とした環境（Android開発やJenkinsなど）を用意する


## 方法

色々ググるとOracleからJDKをインストールする手順が多く見かけるが、2019年現在では状況が変わり、OracleからJDKをインストールするよりもOpenJDKをインストールしてJavaを扱えるように対応すると良い。

OpenJDKに関しては、きしだ（@nowokay）さんの以下の記事を参考にしてください。

* [JDK、Oracle JDK、OpenJDK、Java SEってなに？](https://qiita.com/nowokay/items/c1de127354cd1b0ddc5e)


### OpenJDKのインストール方法

大枠の手順は、@spaciba_h_t さんの以下の記事を参考にすると良いです。

* [macにopenjdk11をインストール](https://qiita.com/spaciba_h_t/items/c96e96be99596b0a9fe4)

### バージョンについて

2019/11現在のOpenJDKの安定板バージョンは、`JDK 13`のようです。

<img width="608" alt="スクリーンショット 2019-11-19 15.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/346d8639-45d2-ca29-f3f1-070a0687c3a9.png">


### Jenkinsについて

スマホアプリを開発しているエンジニアであれば、MacMini/MacPro(ゴミ箱版)などにJenkinsを入れてCI環境を作るなんて珍しく無いと思います。

- [Unityで開発しているゲームの単体テストをCI環境で運用している話](https://labs.gree.jp/blog/2015/12/15392/)
- [Jenkinsによる自動ビルド環境構築の一例](https://developer.aiming-inc.com/ci/auto-build-jenkins-macmini/)
- [メルカリQA-SETチームが進めているテスト自動化についての質問まとめ](https://tech.mercari.com/entry/2017/10/03/093955)
- [CIマニアから見た各種CIツールの使い所](https://sue445.hatenablog.com/entry/2018/12/07/114638)

そんなJenkinsをMacに環境を作る際にOpenJDKのバージョンが`JDK 13`では以下のようにエラーとなります。

```shell
$ /usr/libexec/java_home  -V
Matching Java Virtual Machines (1):
    13.0.1, x86_64:	"OpenJDK 13.0.1"	/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home

# .bash_profileの設定省略...

$ java --version
openjdk 13.0.1 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

$ java -jar jenkins.war 
11月 19, 2019 3:13:40 午後 Main verifyJavaVersion
重大: Running with Java class version 57 which is not in the list of supported versions: [52, 55]. Run with the --enable-future-java flag to enable such behavior. See https://jenkins.io/redirect/java-support/
java.lang.UnsupportedClassVersionError: 57.0
	at Main.verifyJavaVersion(Main.java:174)
	at Main.main(Main.java:142)

Jenkins requires Java versions [8, 11] but you are running with Java 13 from /Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home
java.lang.UnsupportedClassVersionError: 57.0
	at Main.verifyJavaVersion(Main.java:174)
	at Main.main(Main.java:142)

```

2019年現在のJenkins公式ページの[Java requirements](https://jenkins.io/doc/administration/requirements/java/)では、OpenJDKのバージョンは以下の２点をサポートしている模様です。

- OpenJDK JDK / JRE 8 - 64 bits
- OpenJDK JDK / JRE 11 - 64 bits

そのため古いJDKバージョンをインストールするには、[Archived OpenJDK General-Availability Releases](http://jdk.java.net/archive/)のページから特定のバージョンのJDKをインストールし、再度環境設定を行う必要があります。

```shell
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    13.0.1, x86_64:	"OpenJDK 13.0.1"	/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home
    11.0.2, x86_64:	"OpenJDK 11.0.2"	/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

# .bash_profileの設定省略...

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

$ java -jar jenkins.war 
Running from: /Users/gremito/jenkins.war
webroot: $user.home/.jenkins
2019-11-19 05:51:56.703+0000 [id=1] INFO    org.eclipse.jetty.util.log.Log#initialized: Logging initialized @506ms to org.eclipse.jetty.util.log.JavaUtilLog

...

```

ちなみにMacにJenkinsの環境を作る方法は、@t_nさんの以下のQiita記事と公式のページが参考になります。

- [MACへJenkinsをインストール(インストールの仕方編)](https://qiita.com/t_n/items/22e6c5fd9f2ced3d5fc4)
- [Installing Jenkins #WAR file](https://jenkins.io/doc/book/installing/#war-file)

## 追記 2022/04: M1にSDKMANでJavaをインストールしてみた

```shell
% java -version 
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

% curl -s "https://get.sdkman.io" | bash

                                -+syyyyyyys:
                            `/yho:`       -yd.
                         `/yh/`             +m.
                       .oho.                 hy                          .`
                     .sh/`                   :N`                `-/o`  `+dyyo:.
                   .yh:`                     `M-          `-/osysoym  :hs` `-+sys:      hhyssssssssy+
                 .sh:`                       `N:          ms/-``  yy.yh-      -hy.    `.N-````````+N.
               `od/`                         `N-       -/oM-      ddd+`     `sd:     hNNm        -N:
              :do`                           .M.       dMMM-     `ms.      /d+`     `NMMs       `do
            .yy-                             :N`    ```mMMM.      -      -hy.       /MMM:       yh
          `+d+`           `:/oo/`       `-/osyh/ossssssdNMM`           .sh:         yMMN`      /m.
         -dh-           :ymNMMMMy  `-/shmNm-`:N/-.``   `.sN            /N-         `NMMy      .m/
       `oNs`          -hysosmMMMMydmNmds+-.:ohm           :             sd`        :MMM/      yy
      .hN+           /d:    -MMMmhs/-.`   .MMMh   .ss+-                 `yy`       sMMN`     :N.
     :mN/           `N/     `o/-`         :MMMo   +MMMN-         .`      `ds       mMMh      do
    /NN/            `N+....--:/+oooosooo+:sMMM:   hMMMM:        `my       .m+     -MMM+     :N.
   /NMo              -+ooooo+/:-....`...:+hNMN.  `NMMMd`        .MM/       -m:    oMMN.     hs
  -NMd`                                    :mm   -MMMm- .s/     -MMm.       /m-   mMMd     -N.
 `mMM/                                      .-   /MMh. -dMo     -MMMy        od. .MMMs..---yh
 +MMM.                                           sNo`.sNMM+     :MMMM/        sh`+MMMNmNm+++-
 mMMM-                                           /--ohmMMM+     :MMMMm.       `hyymmmdddo
 MMMMh.                  ````                  `-+yy/`yMMM/     :MMMMMy       -sm:.``..-:-.`
 dMMMMmo-.``````..-:/osyhddddho.           `+shdh+.   hMMM:     :MmMMMM/   ./yy/` `:sys+/+sh/
 .dMMMMMMmdddddmmNMMMNNNNNMMMMMs           sNdo-      dMMM-  `-/yd/MMMMm-:sy+.   :hs-      /N`
  `/ymNNNNNNNmmdys+/::----/dMMm:          +m-         mMMM+ohmo/.` sMMMMdo-    .om:       `sh
     `.-----+/.`       `.-+hh/`         `od.          NMMNmds/     `mmy:`     +mMy      `:yy.
           /moyso+//+ossso:.           .yy`          `dy+:`         ..       :MMMN+---/oys:
         /+m:  `.-:::-`               /d+                                    +MMMMMMMNh:`
        +MN/                        -yh.                                     `+hddhy+.
       /MM+                       .sh:
      :NMo                      -sh/
     -NMs                    `/yy:
    .NMy                  `:sh+.
   `mMm`               ./yds-
  `dMMMmyo:-.````.-:oymNy:`
  +NMMMMMMMMMMMMMMMMms:`
    -+shmNMMMNmdy+:`


                                                                 Now attempting installation...


Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Installing SDKMAN scripts...
Create distribution directories...
Getting available candidates...
Prime the config file...
Download script archive...
######################################################################## 100.0%-######################################################################## 100.0%
Extract script archive...
Install scripts...
Set version to 5.15.0 ...
Attempt update of login bash profile on OSX...
Added sdkman init snippet to /Users/gremito/.bash_profile
Attempt update of zsh profile...
Updated existing /Users/gremito/.zshrc



All done!


You are subscribed to the STABLE channel.

Please open a new terminal, or run the following in the existing one:

    source "/Users/gremito/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

% source "$HOME/.sdkman/bin/sdkman-init.sh"
% sdk install java
==== BROADCAST =================================================================
* 2022-04-22: groovy 4.0.2 available on SDKMAN!
* 2022-04-21: springboot 2.6.7 available on SDKMAN!
* 2022-04-21: springboot 2.5.13 available on SDKMAN!
================================================================================

Downloading: java 17.0.2-tem

In progress...

##################################################################################################################################################### 100.0%##################################################################################################################################################### 100.0%

Repackaging Java 17.0.2-tem...

Done repackaging...
Cleaning up residual files...

Installing: java 17.0.2-tem
Done installing!


Setting java 17.0.2-tem as default.

% java -version                            
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode)
```