LoginSignup
2
0

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

Last updated at Posted at 2023-08-26

目次

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.0Java 17 を表し,55.0Java 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 のバージョン管理も考えないとな......

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0