目次
1. javac でコンパイルしたクラスファイルを java で実行したら怒られた
2. SDKMAN! インストールした Java と apt でインストールした OpenJDK があった
3. OpenJDK のアンインストール
4. まとめ
参考文献
1. javac でコンパイルしたクラスファイルを java で実行したら怒られた
Java の練習に Java 100 本ノックに取り組み始めたのですが,やりはじめて早々壁にぶち当たりました.
$ 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 では実行できないぜって言われている.まぁ一応コマンドで確認.
$ 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 でインストールしたものでした.
$ which javac
[MYHOME]/.sdkman/candidates/java/current/bin/javac
$ which java
/usr/bin/java
SDKMAN! を使っている理由は会社支給の Mac と環境を合わせるためなので,SDKMAN! の java を使えるようにします.ってか SDKMAN! が設定する PATH って /usr/bin よりも優先順位低いんですね.
3. OpenJDK のアンインストール
何がインストールされているのか,まずは確認.
$ 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 も入っているぽいんだけど,とりあえず全部消してみる.
$ sudo apt purge openjdk*
~~~省略~~~
Removing alternatives
あ,alternatives でバージョン分けれるんだ.Mac は alternatives がないから SDKMAN! なんでしょうか?
それはおいといて,無事に実行できました.
$ 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 確認