2017-10-30 10 views
2

アプリケーションを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
+2

使用するライブラリのバージョンについてお聞かせください。ここでの主な問題は、Java 9コードをJava 8コードとしてコンパイルするコアライブラリです。関連[Java9プロジェクト内のファイルmodule-info.classを処理できないためClassFormatExceptionが発生する](https:// stackoverflow。com/questions/45802981/java-project-results-in-class内のファイル処理不可能なモジュールモジュール情報クラス) – nullpointer

+0

@nullpointerさらに説明できますか?アプリケーションはIDEでうまく動いていますが、Java 9では問題なくコンパイルできます(Java 8ではなく)。ドッカーで公開して実行する場合にのみ、それは機能しません。このエラーは、プロジェクトがjava 9でコンパイルされているが、ドッカーがjava 8を使用していることを示しています。 – Spen

+0

'公開'と '実行'中に推測すると、クラスファイルにアクセスしようとしているあたかもJava 8クラスであるかのように、Java 9を使ってコンパイルされています。さらなるデバッグのために、完全なログを記述し、質問の中で言及されているように、発行および実行中の詳細な手順を記述したいと思うかもしれません。推測の野生ASMは、私がさまざまなライブラリで目撃したような例はほとんどありません。 – nullpointer

答えて

1

エラーは、新しいバージョンのJavaを使用してコンパイルされたコードを実行しようとしていることを意味します9のクラス・バージョン53.0)を旧バージョンのJava(クラス・バージョン52.0の8)にインストールします。したがって、ドッカーのイメージにJava 8がインストールされている可能性があります。探偵活動をしましょう。 :-)

私が正しく理解している場合は、sbt-native-packagerを使用してDockerイメージを生成しています。もしそうなら、あなたがここに見ることができるように、SBT-ネイティブパッケージャは、基本イメージとしてopenjdk:latest画像を使用している:あなたもできるよう

https://github.com/sbt/sbt-native-packager/blob/v1.3.1/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala#L69

バージョン1.3.1は、プレイ2.6.7で使用されるバージョンでありますここを参照してください:

https://github.com/playframework/playframework/blob/2.6.7/framework/project/plugins.sbt#L8

問題はopenjdk:latest画像は、あなたがlatestコードlinked at the image pageを見て、それを確認できるJava 8を使用していることです。ここでは、コードです:あなたはたとえば、Javaの9を使用してベースイメージを使用するようにdockerBaseImageを変更する可能性があることを考えると

https://github.com/docker-library/openjdk/blob/a893fe3cd82757e7bccc0948c88bfee09bd916c3/8-jdk/Dockerfile#L38-L43

dockerBaseImage := "9-jdk" 

あなたがの完全なリストを表示することができます画像のバージョンは次のとおりです:https://hub.docker.com/_/openjdk/

+1

私が思ったようなこの音。私は使用されたjdkのバージョンを変更する方法を知らなかった。月曜日に私はそれを試してみます。 – Spen

関連する問題