当前位置: 首页 > 知识库问答 >
问题:

在docker上运行java fie返回错误[重复]

燕翼
2023-03-14

我尝试用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文件,并在输出中得到

  • 共有1个答案

    丘普松
    2023-03-14

    错误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的副本? 问题答案: 听起来您没有使用安全管理器: 您是否有政策文件(): 并使用运行您的程序