我尝试用docker运行一个简单的java类,执行以下步骤:
>
创建java文件(helloworld.java)
编译它(javac helloworld.java)
创建dockerfile(位于dockerfile内容的上方)
FROM alpine:latest
ADD HelloWorld.class HelloWorld.class
RUN apk --update add openjdk8-jre
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "HelloWorld"]
然后我使用以下命令构建它:
docker build --tag "docker-hello-world:latest" .
C:\Gradle>javac HelloWorld.java
C:\Gradle>docker build --tag "docker-hello-world:latest" .
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 209B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/alpine:latest
=> [internal] load build context
=> => transferring context: 471B
=> [1/3] FROM docker.io/library/alpine:latest
=> CACHED [2/3] ADD HelloWorld.class HelloWorld.class
=> CACHED [3/3] RUN apk --update add openjdk8-jre
=> exporting to image
=> => exporting layers
=> => writing image sha256:e3450ba2f444321b7d9965d95443e1d394ef8c62549268059e9786bb882992ec
=> => naming to docker.io/library/docker-hello-world:latest
docker run docker-hello-world:latest
C:\Gradle>docker run docker-hello-world:latest
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 59.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:757)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
这是我机器上的java版本:
C:\Gradle>java -version
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment (build 15.0.1+9-18)
OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
顺便说一句,我在我的机器上用相同的java版本构建我的java文件,因此我不知道为什么错误说,HelloWorld java文件是由更新版的java Runtime编译的...我的目的只是使用docker运行这个Java文件,并在输出中得到
错误unsupportedClassVersionError
表示您正在尝试执行用错误的Java版本编译的类。
您已经用最近的java版本(15)编译了这个类,但是您在Docker内部运行的是Java8。
将docker中的java版本升级到Java15将修复该错误。
编辑:在linux Alpine上,openjdk15-jre仅在testing
存储库上可用。
FROM alpine:latest
ADD HelloWorld.class HelloWorld.class
RUN apk --update add openjdk15-jre --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "HelloWorld"]
编辑
另一个有价值的解决方案是编译java类使其与Java8兼容。
javac -source 8 -target 8 HelloWorld.java
之后,使用原始配置创建docker:
FROM alpine:latest
ADD HelloWorld.class HelloWorld.class
RUN apk --update add openjdk8-jre
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "HelloWorld"]
我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?
问题内容: 如果PHP脚本在某处失败,是否有办法使PHP返回AJAX错误代码?我正在关注一个教程,并将其输入到我的PHP中: 一切都很好,直到我意识到这是JSON数据。有没有一种方法可以使用标准的$ _POST和返回的HTML数据返回错误(例如,触发jQuery的AJAX 事件? 问题答案: 我不了解jQuery,但是如果它区分成功和失败(HTTP 200 OK vs. HTTP!= 200)Aj
问题内容: 我尝试了以下文档以在Google云上运行node.js应用程序:https : //cloud.google.com/nodejs/getting-started/hello- world Node.js运行正常,但是如果我运行,我会…。 问题答案: 最新的Google Cloud SDK 0.9.65版本存在一个错误。 您可以使用以下命令还原到Cloud SDK 0.9.64: 下一
基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par
问题内容: 借助Android 4.4 KitKat,Google将linux内核升级到3.8版,这是Docker所需的内核版本。 我不知道AUFS部分,但是有没有办法通过此更新在android上运行docker容器? 问题答案: 根据文档,Android内核缺少LXC所需的很多内核功能。 也许将来使用Docker 1.x,可能会编写一个使用Android功能而非LXC的插件。但就目前而言,您需要
问题内容: 我正在运行的程序在这里上差异的物理机器2级的JVM。我得到了错误 我什至尝试在同一台机器(未更改的程序)上运行它,但是它可以在diff机器上运行。有人可以帮我吗? @ beny23-谢谢,但我仍然遇到此错误: 客户端如何拥有CalculatorImpl_stub的副本? 问题答案: 听起来您没有使用安全管理器: 您是否有政策文件(): 并使用运行您的程序