# ローカル環境のプログラミング言語のバージョンを切り替え macOS

## ローカル環境のプログラミング言語のバージョンを切り替え macOS

### Java

Javaのバージョンを切り替えようとした背景としては、`mvn clean install`を実行したところ、以下のエラーを受け取ったことが理由でした。

```
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project ReleaseBuildApp: Fatal error compiling: java.lang.ExceptionInInitializerError: Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module @193594ad -> [Help 1]
```

Mavenの期待するバージョンと利用しているJavaのバージョンが異なる時に上記のエラーを受け取る事がわかりました(Refer: [Maven Build Failure - Compiler Plugin](https://stackoverflow.com/questions/66893106/maven-build-failure-compiler-plugin) )

たしかに`pom.xml`でJava 8を期待するものとなっていました。

```
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
</plugin>
```

一方で、ローカル端末の環境はJava 15でした。

```
$ java -version
java version "15.0.1" 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
```

ローカル環境ではこのバージョンのみ入っていました。

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

/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
```

Java 8をインストールしますが、ライセンスの関係でOpenJDKが利用できないので、AdoptOpenJDKやCorretto,Zuluなどを入れます。ここではCorrettoを使用します。

```
$ brew install --cask corretto8
```

以下のように実行することで、Javaのバージョンの切り替え完了です。

```
$ export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
$ PATH=${JAVA_HOME}/bin:${PATH}
```

以下のように反映が適用されていることが確認できます。

```
$ java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment Corretto-8.312.07.1 (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM Corretto-8.312.07.1 (build 25.312-b07, mixed mode)
```

環境変数`JAVA_HOME`に代入された値は参考までに以下のような値です。

```
$ /usr/libexec/java_home -v "1.8"
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home
$ /usr/libexec/java_home -v "15" 
/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
```

#### jenv

* [jenv](https://github.com/jenv/jenv)を利用する方法もあります。jenvを利用することで、簡単に変えられるようにします。

Javaの現状のバージョンが以下の通りであるとします。

```
$ java --version
java 15.0.1 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
```

jenvをインストールします。

```
$ brew install jenv
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
$ source ~/.zshrc
$ mkdir -p ~/.jenv/versions  
```

現在jenvを通してインストールされているJavaのバージョンは他にない状態です。

```
$ jenv versions
* system (set by /Users/hayshogo/.jenv/version)
```

Java 8とJava 15をインストールします。

```
$ jenv add `/usr/libexec/java_home -v "1.8"`
$ jenv add `/usr/libexec/java_home -v "15"` 
```

OpenJDK 17をインストールする場合は以下のように実行。

```
$ jenv add /usr/local/opt/openjdk/libexec/openjdk.jdk/Contents/Home
```

* References
  * [jenv can't find java 17 installed through the brew on MacOS](https://stackoverflow.com/questions/70296797/jenv-cant-find-java-17-installed-through-the-brew-on-macos)

すると、jenvを通して以下のJavaのバージョンがインストールされたことが確認できます。

```
$ jenv versions                             
* system (set by /Users/hayshogo/.jenv/version)
  1.8
  1.8.0.312
  15
  15.0
  15.0.1
  corretto64-1.8.0.312
  oracle64-15.0.1
```

以下のようにバージョンを切り替えます。

```
$ jenv global 1.8.0.312
$ jenv versions
  system
  1.8
* 1.8.0.312 (set by /Users/hayshogo/.jenv/version)
  15
  15.0
  15.0.1
  corretto64-1.8.0.312
  oracle64-15.0.1
$ jenv version
1.8.0.312 (set by /Users/hayshogo/.jenv/version)
```

**Errors**

`java -version`をしてもうまく切り替わらない場合は、`jenv doctor`を実行します。

```
$ jenv doctor
[OK]	No JAVA_HOME set
[ERROR]	Java binary in path is not in the jenv shims.
[ERROR]	Please check your path, or try using /path/to/java/home is not a valid path to java installation.
	PATH : /usr/local/Cellar/jenv/0.5.4/libexec/libexec:/Users/hayshogo/.jenv/bin:/Users/hayshogo/.pyenv/shims:/Users/hayshogo/.rbenv/shims:/Users/hayshogo/.nodenv/shims:/usr/local/src/scala/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/Applications/Wireshark.app/Contents/MacOS:/Users/hayshogo/.nodebrew/current/bin:/usr/local/php5/bin:/usr/local/Cellar/pyenv-virtualenv/1.1.5/shims:/Users/hayshogo/.pyenv/bin:/usr/local/apache-maven-3.5.0/bin:/Users/hayshogo/.golang/bin:/Users/hayshogo/.local/bin/:/usr/local/opt/mysql-client/bin:/usr/local/texlive/2019/bin/x86_64-darwin/:/usr/local/opt/openssl/bin:/Users/hayshogo/.toolbox/bin:/Users/hayshogo/scripts/:/usr/local/opt/curl/bin:/Users/hayshogo/.pyenv/shims:/Users/hayshogo/.rbenv/shims:/Users/hayshogo/.nodenv/shims:/usr/local/src/scala/bin
[ERROR]	Jenv is not loaded in your zsh
[ERROR]	To fix : 	echo eval "$(jenv init -)" >> /Users/hayshogo/.zshrc
```

提示された解決方法を実行して、設定ファイルを読み込みます。

```
$ echo eval "$(jenv init -)" >> /Users/hayshogo/.zshrc
$ source ~/.zshrc
$ java -version 
openjdk version "1.8.0_312"
OpenJDK Runtime Environment Corretto-8.312.07.1 (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM Corretto-8.312.07.1 (build 25.312-b07, mixed mode)
```

* References
  * [jenv](https://github.com/jenv/jenv)
  * [jenv: no such command \`enable-plugin' #64](https://github.com/jenv/jenv/issues/64)
  * [MacのBrewで複数バージョンのJavaを利用する + jEnv](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2)

追記予定

### Ruby - rbenv

### Python - pyenv

### Node.js - nodenv


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hayashier.gitbook.io/article/development/programming-environment.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
