minecraft(マイクラ)が1.17にバージョンアップしたことに伴い、Java16対応が必要となりました。
ただネットでいろいろ調べてもなかなか正常にサーバが起動せず、処置完了、解決までに何と3日掛かりました。備忘録としてその方法を残しておきます。次のバージョンアップに備えて。。
ubuntuもdockerもJavaも詳しくない素人が、ネットの記事(時には海外のページ)を見てツギハギしながら対応したので、真似される方は自己責任でお願いします。(たぶんもっとスッキリとしたやり方があるはず)
Java16インストールした後に問題発生
試行錯誤しながらUbuntuにJava16を入れ終わって、minecraftのサーバ起動・確認のため
#起動
docker-compose up -d
#ステータス確認
docker-compose ps
を実行したところ
Name Command State Ports
-----------------------------------
mc /start Restarting
と、再起動中(Restarting)との表示。
#ログを表示
docker-compose logs -f
上記でログを確認したところ、
mc | Error: A JNI error has occurred, please check your installation and try again
mc | Exception in thread "main" java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 52.0
というエラーが出ているとのこと。
『このサーバは Java Runtime の version 60.0 でコンパイルされているけど、いまは古いものを使っている』
という意味で、処置方法がネットに上がっていますが、「Java16 に上げてね」くらいしか書かれていません。
可能性としては、古いバージョンのJavaにアクセスしている、キャッシュが残っていると考え、ここで一旦すべてのJava関連のパッケージを削除(アンインストール)することにしました。
dockerのイメージレイヤに古いJava関連のファイルが残っている?
完全にアンインストールできたか確認するために、
sudo updatedb
sudo locate -b '\pack200'
※上記の'\'はバックスラッシュ
を実行したところ(何も引っかからないと思っていたら)、
/var/lib/docker/overlay2/省略/diff/usr/lib/jvm/java-1.8-openjdk/bin/pack200
/var/lib/docker/overlay2/省略/diff/usr/lib/jvm/java-1.8-openjdk/jre/bin/pack200
と、docker のイメージレイヤに “java-1.8-openjdk” という古いバージョンのファイルが残っていることを発見。
そこで、再度 Java16 をインストールした後で、以下を実施しました。
#コンテナを起動
docker-compose up -d
#起動しているコンテナの情報を取得
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(コンテナID) itzg/minecraft-server "/start" 10 minutes ago Restarting (0) 3 seconds ago mc
#dockerイメージの情報を取得
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
itzg/minecraft-server latest (イメージID) 16 months ago 273MB
#コンテナを停止
docker stop (コンテナID)
#dockerイメージを削除
docker rmi -f (イメージID)
#upで作成したコンテナとネットワークを削除
docker-compose down
#再度コンテナを起動
docker-compose up -d
イメージ削除、そして再起動を実施したところ、「 Error: A JNI error has occurred, please check your installation and try again 」のエラーは出なくなり、無事にサーバが起動しました。
dockerのイメージ削除とか、なかなかたどり着くまで大変でした。
でもこの機会に色々な仕組みを知ることができて良かったかなーって思います。
なお、downでコンテナを削除する際に、”–rmi” というオプションを付けることでイメージも削除できるそうですが、それは次の機会にでも挑戦してみようかな。