アプリケーションをJava 8からJava 9に変更しました。 Windowsシステム環境変数(パス)とJAVA_HOMEをJava 9(jdk-9.0.1)に変更しました。ドッカーでJava 9アプリケーションを実行できない - UnsupportedClassVersionError
IDE(IntelliJ)でアプリケーションを実行すると問題なく動作します。また、sbtで問題なくコンパイルされます。ドッカーでアプリケーションを実行するだけでは機能しません。
アプリケーションはJava 9で正常にコンパイルされているようですが、ドッカーはJava 8でこれを実行しようとします(これは例外メッセージから読んだものです)。
コマンド:
sbt docker:publish
docker run --rm -p 9000:9000 eu.gcr.io/the-repository-name/the-image-name:1.0
私は次のエラーを取得する:
Exception in thread "main" java.lang.UnsupportedClassVersionError:
Module has been compiled by a more recent version of the
Java Runtime (class file version 53.0), this version of the
Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at play.api.inject.Modules$.locate(Module.scala:119)
at play.api.inject.guice.GuiceableModule$.loadModules(GuiceInjectorBuilder.scala:276)
at play.api.inject.guice.GuiceApplicationBuilder$.$anonfun$$lessinit$greater$default$9$1(GuiceApplicationBuilder.scala:30)
at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:102)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:51)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
何ドッカーは、Java 9使用していること、私がしなければならないのですか?
java --version
java 9.0.1
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
docker version
Client:
Version: 17.10.0-ce
API version: 1.33
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:00:02 2017
OS/Arch: windows/amd64
Server:
Version: 17.10.0-ce
API version: 1.33 (minimum version 1.12)
Go version: go1.8.3
Git commit: f4ffd25
Built: Tue Oct 17 19:05:23 2017
OS/Arch: linux/amd64
Experimental: true
- プレイバージョン:2.6.7
- Scalaのバージョン2.12.4
- SBTバージョン:1.0.2
- SBT-ネイティブパッケージャ:1.3.1
使用するライブラリのバージョンについてお聞かせください。ここでの主な問題は、Java 9コードをJava 8コードとしてコンパイルするコアライブラリです。関連[Java9プロジェクト内のファイルmodule-info.classを処理できないためClassFormatExceptionが発生する](https:// stackoverflow。com/questions/45802981/java-project-results-in-class内のファイル処理不可能なモジュールモジュール情報クラス) – nullpointer
@nullpointerさらに説明できますか?アプリケーションはIDEでうまく動いていますが、Java 9では問題なくコンパイルできます(Java 8ではなく)。ドッカーで公開して実行する場合にのみ、それは機能しません。このエラーは、プロジェクトがjava 9でコンパイルされているが、ドッカーがjava 8を使用していることを示しています。 – Spen
'公開'と '実行'中に推測すると、クラスファイルにアクセスしようとしているあたかもJava 8クラスであるかのように、Java 9を使ってコンパイルされています。さらなるデバッグのために、完全なログを記述し、質問の中で言及されているように、発行および実行中の詳細な手順を記述したいと思うかもしれません。推測の野生ASMは、私がさまざまなライブラリで目撃したような例はほとんどありません。 – nullpointer