运行 Java 9 应用 docker 不工作 - UnsupportedClassVersionError
Running Java 9 application with docker doesn't work - UnsupportedClassVersionError
我将我的应用程序从 Java 8 更改为 Java 9。
将 Windows 系统环境变量(路径)和 JAVA_HOME 更改为 Java 9 (jdk-9.0.1).
当 运行 在 IDE (IntelliJ) 中运行应用程序时,它工作正常。它也可以毫无问题地编译 sbt。仅 运行 将应用程序与 docker 结合使用是行不通的。
应用程序似乎使用 Java 9 编译成功,但 docker 尝试使用 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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.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(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)
我必须做什么,Docker 使用 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-native-packager: 1.3.1
该错误意味着您正在尝试 运行 使用较新版本的 Java(9 具有 class 版本 53.0)在较旧版本的 [=38] 中编译代码=](8 具有 class 版本 52.0)。所以,您的 docker 图像可能安装了 Java 8。让我们做一些侦探工作。 :-)
如果我没理解错的话,你正在使用 sbt-native-packager 来生成你的 Docker 图像。如果是这样,sbt-native-packager 正在使用 openjdk:latest
图像作为基础图像,正如你在这里看到的:
版本1.3.1是Play 2.6.7使用的版本,你也可以在这里看到:
https://github.com/playframework/playframework/blob/2.6.7/framework/project/plugins.sbt#L8
问题是 openjdk:latest
图像使用 Java 8。您可以通过查看 latest
代码 linked at the image page 来确认这一点。这是代码:
鉴于此,您可能希望更改 dockerBaseImage
以使用使用 Java 9 的基本图像,例如:
dockerBaseImage := "9-jdk"
您可以在此处查看图像版本的完整列表:https://hub.docker.com/_/openjdk/
我将我的应用程序从 Java 8 更改为 Java 9。 将 Windows 系统环境变量(路径)和 JAVA_HOME 更改为 Java 9 (jdk-9.0.1).
当 运行 在 IDE (IntelliJ) 中运行应用程序时,它工作正常。它也可以毫无问题地编译 sbt。仅 运行 将应用程序与 docker 结合使用是行不通的。
应用程序似乎使用 Java 9 编译成功,但 docker 尝试使用 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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.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(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)
我必须做什么,Docker 使用 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-native-packager: 1.3.1
该错误意味着您正在尝试 运行 使用较新版本的 Java(9 具有 class 版本 53.0)在较旧版本的 [=38] 中编译代码=](8 具有 class 版本 52.0)。所以,您的 docker 图像可能安装了 Java 8。让我们做一些侦探工作。 :-)
如果我没理解错的话,你正在使用 sbt-native-packager 来生成你的 Docker 图像。如果是这样,sbt-native-packager 正在使用 openjdk:latest
图像作为基础图像,正如你在这里看到的:
版本1.3.1是Play 2.6.7使用的版本,你也可以在这里看到:
https://github.com/playframework/playframework/blob/2.6.7/framework/project/plugins.sbt#L8
问题是 openjdk:latest
图像使用 Java 8。您可以通过查看 latest
代码 linked at the image page 来确认这一点。这是代码:
鉴于此,您可能希望更改 dockerBaseImage
以使用使用 Java 9 的基本图像,例如:
dockerBaseImage := "9-jdk"
您可以在此处查看图像版本的完整列表:https://hub.docker.com/_/openjdk/