javac と java のバージョンが違うと怒られた

# 目次
[1. javac でコンパイルしたクラスファイルを java で実行したら怒られた](#1-javac-でコンパイルしたクラスファイルを-java-で実行したら怒られた)
[2. SDKMAN! インストールした Java と apt でインストールした OpenJDK があった](#2-sdkman-インストールした-java-と-apt-でインストールした-openjdk-があった)
[3. OpenJDK のアンインストール](#3-openjdk-のアンインストール)
[4. まとめ](#4-まとめ)
[参考文献](#参考文献)

# 1. javac でコンパイルしたクラスファイルを java で実行したら怒られた
Java の練習に [Java 100 本ノック](https://github.com/JustSystems/java-100practices)に取り組み始めたのですが，やりはじめて早々壁にぶち当たりました．
```console
$ javac MyAnswer001.java
$ java MyAnswer001
Error: LinkageError occurred while loading main class MyAnswer001
        java.lang.UnsupportedClassVersionError: MyAnswer001 has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
```
javac と java のバージョンが違うようです．ちなみにここで出てくる **61.0** は **Java 17** を表し，**55.0** は **Java 11** を表すみたい．要するに，*Java 17 でコンパイルされてるから Java 11 では実行できないぜ*って言われている．まぁ一応コマンドで確認．
```console
$ javac --version
javac 17.0.7
$ java --version
openjdk 11.0.18 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Debian-1deb11u1, mixed mode, sharing)
```

# 2. SDKMAN! インストールした Java と apt でインストールした OpenJDK があった
なんと javac は SDKMAN! でインストールしたもので，java は apt でインストールしたものでした．
```console
$ which javac
[MYHOME]/.sdkman/candidates/java/current/bin/javac
$ which java
/usr/bin/java
```
SDKMAN! を使っている理由は会社支給の Mac と環境を合わせるためなので，SDKMAN! の java を使えるようにします．ってか SDKMAN! が設定する PATH って /usr/bin よりも優先順位低いんですね．

# 3. OpenJDK のアンインストール
何がインストールされているのか，まずは確認．
```console
$ sudo apt list | grep openjdk

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

openjdk-11-dbg/oldstable-security 11.0.20+8-1~deb11u1 amd64
openjdk-11-demo/oldstable-security 11.0.20+8-1~deb11u1 amd64
openjdk-11-doc/oldstable-security 11.0.20+8-1~deb11u1 all
openjdk-11-jdk-headless/oldstable-security 11.0.20+8-1~deb11u1 amd64
openjdk-11-jdk/oldstable-security 11.0.20+8-1~deb11u1 amd64
openjdk-11-jre-dcevm/oldstable 11.0.12+7-1 amd64
openjdk-11-jre-headless/oldstable-security 11.0.20+8-1~deb11u1 amd64 [upgradable from: 11.0.18+10-1~deb11u1]
openjdk-11-jre-zero/oldstable-security 11.0.20+8-1~deb11u1 amd64
openjdk-11-jre/oldstable-security 11.0.20+8-1~deb11u1 amd64 [upgradable from: 11.0.18+10-1~deb11u1]
openjdk-11-source/oldstable-security 11.0.20+8-1~deb11u1 all
openjdk-17-dbg/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-demo/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-doc/oldstable-security 17.0.7+7-1~deb11u1 all
openjdk-17-jdk-headless/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-jdk/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-jre-headless/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-jre-zero/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-jre/oldstable-security 17.0.7+7-1~deb11u1 amd64
openjdk-17-source/oldstable-security 17.0.7+7-1~deb11u1 all
uwsgi-plugin-jvm-openjdk-11/oldstable 2.0.19.1-7.1 amd64
uwsgi-plugin-jwsgi-openjdk-11/oldstable 2.0.19.1-7.1 amd64
uwsgi-plugin-ring-openjdk-11/oldstable 2.0.19.1-7.1 amd64
uwsgi-plugin-servlet-openjdk-11/oldstable 2.0.19.1-7.1 amd64
```
OpenJDK 17 も入っているぽいんだけど，とりあえず全部消してみる．
```console
$ sudo apt purge openjdk*
~~~省略~~~
Removing alternatives
```
あ，alternatives でバージョン分けれるんだ．Mac は alternatives がないから SDKMAN! なんでしょうか? 
それはおいといて，無事に実行できました．
```console
$ which java
[MYHOME]/.sdkman/candidates/java/current/bin/java
$ java MyAnswer001
Hello, World!
```

# 4. まとめ
SDKMAN! は pyenv とは違いおしとやかですね．pyenv は平気で環境変数上書きして curl とか隠れちゃいますからね．Python のバージョン管理も考えないとな......

# 参考文献
- Javaバージョン, ひしだま's 技術メモページ, https://www.ne.jp/asahi/hishidama/home/tech/java/version.html, 2023-08-27 確認
- Ubuntu 20.04 - OpenJDK 11 のインストール、削除、, codechacha, https://codechacha.com/ja/ubuntu-install-open-jdk11/, 2023-08-27 確認