【问题标题】:run java code on docker在 docker 上运行 java 代码
【发布时间】:2018-04-20 23:51:55
【问题描述】:

我尝试在 docker 上运行 java 代码,但是我遇到了一个我无法解决的错误,你能帮帮我吗?!

我有一个非常简单的 java 代码来计算平均值。

import java.util.Scanner;

class Ave
{
     public static void main(String args[])

     {

          int n;
          double res=0;

      Scanner reader=new Scanner(System.in);

      System.out.println("Enter how many numbers to calculate the avrage ");

          n=reader.nextInt();

      int a[]=new int[n];

      System.out.println("Enter   "+n+"  numbers");

          for(int i=0;i<n;i++)
           a[i]= (int) reader.nextDouble(); 

      res=Ave.CalAvg(a,n); 

      System.out.println("The average is " +res/n);

     }

       static double CalAvg(int  a[],int n)
       {
       double res=0;

       for(int i=0;i<n;i++)
           res =res+a[i];

       return res;
        }
}

我的 Dockerfile 是

FROM alpine:latest
ADD Ave.class Ave.class
RUN apk --update add openjdk8-jre
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "Ave"]

我做了什么,我使用 Java 编译器编译了这个文件。

$ javac Ave.java

我使用下面的命令从这个 Dockerfile 构建一个图像

$ docker build --tag "docker-hello-world:latest" .

然后,我尝试通过执行以下命令来运行 Docker 映像以查看结果。

$ docker run docker-hello-world:latest

最后,我得到了这个我无法弄清楚的错误或异常

代码在服务器和本地机器上运行,但在docker上不起作用

Enter how many numbers to calculate the avrage 
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at Ave.main(Ave.java:17)

The result

【问题讨论】:

  • 试试docker run -it docker-hello-world
  • @SiKing 它也不起作用。 [在线程“main”java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory at Ave.main(Ave.java:21) 中输入多少个数字来计算平均 3 异常原因:java .lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory ... 1 更多原因:java.lang.ClassNotFoundException: java.lang.invoke.StringConcatFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java .lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher... ]
  • @YazeedAlqahhas 我尝试过使用docker run -it docker-hello-world:latest,它对我有用,我使用了您提供的确切java 源代码和确切的Dockerfile。检查您的java 类源代码,该错误看起来像是您向其中添加了更多代码,并且与您在此处发布的不同。

标签: java unix docker dockerfile


【解决方案1】:

尝试关注

我的环境:Mac-Os Sierra-10.12.6

Docker 版本:

Docker version 18.03.0-ce, build 0520e24

检查容器中的 Java 版本:

  1. 执行$docker run -it docker-hello-world:latest

  2. 通过执行$docker ps获取ContainerID

  3. 获取 docker 镜像的 shell docker exec -i -t &lt;CONTAINER ID&gt;

  4. 执行以下命令

    $java -版本

openjdk 版本“1.8.0_151”

OpenJDK 运行时环境 (IcedTea 3.6.0) (Alpine 8.151.12-r0)

OpenJDK 64 位服务器 VM(内部版本 25.151-b12,混合模式)

创建一个目录(我给了a的任何名称),我在桌面创建,

cd ~/Desktop
mkdir a

~/Desktop/a目录下创建Ave.java文件

另外,将 Dockerfile 放在同一目录中(/a)

考虑到 Ave.java 中没有包名

$javac Ave.java

现在 文件夹 /a 将有 3 个文件,Ave.java、Ave.class、Dockerfile

执行以下命令

$docker build -t docker-hello-world:latest .

控制台日志:

Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM alpine:latest
 ---> 3fd9065eaf02
Step 2/4 : ADD Ave.class Ave.class
 ---> 8b94ae6de674
Step 3/4 : RUN apk --update add openjdk8-jre
 ---> Running in f12eb4589a34
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/39) Installing libffi (3.2.1-r4)
(2/39) Installing libtasn1 (4.12-r3)
(3/39) Installing p11-kit (0.23.2-r2)
(4/39) Installing p11-kit-trust (0.23.2-r2)
(5/39) Installing ca-certificates (20171114-r0)
(6/39) Installing java-cacerts (1.0-r0)
(7/39) Installing libxau (1.0.8-r2)
(8/39) Installing libbsd (0.8.6-r1)
(9/39) Installing libxdmcp (1.1.2-r4)
(10/39) Installing libxcb (1.12-r1)
(11/39) Installing libx11 (1.6.5-r1)
(12/39) Installing libxcomposite (0.4.4-r1)
(13/39) Installing libxext (1.3.3-r2)
(14/39) Installing libxi (1.7.9-r1)
(15/39) Installing libxrender (0.9.10-r2)
(16/39) Installing libxtst (1.2.3-r1)
(17/39) Installing alsa-lib (1.1.4.1-r2)
(18/39) Installing libbz2 (1.0.6-r6)
(19/39) Installing libpng (1.6.34-r1)
(20/39) Installing freetype (2.8.1-r2)
(21/39) Installing libgcc (6.4.0-r5)
(22/39) Installing giflib (5.1.4-r1)
(23/39) Installing libjpeg-turbo (1.5.2-r0)
(24/39) Installing libstdc++ (6.4.0-r5)
(25/39) Installing openjdk8-jre-lib (8.151.12-r0)
(26/39) Installing java-common (0.1-r0)
(27/39) Installing krb5-conf (1.0-r1)
(28/39) Installing libcom_err (1.43.7-r0)
(29/39) Installing keyutils-libs (1.5.10-r0)
(30/39) Installing libverto (0.3.0-r0)
(31/39) Installing krb5-libs (1.15.2-r1)
(32/39) Installing lcms2 (2.8-r1)
(33/39) Installing nspr (4.17-r0)
(34/39) Installing sqlite-libs (3.21.0-r0)
(35/39) Installing nss (3.34.1-r0)
(36/39) Installing pcsc-lite-libs (1.8.22-r0)
(37/39) Installing lksctp-tools (1.0.17-r0)
(38/39) Installing openjdk8-jre-base (8.151.12-r0)
(39/39) Installing openjdk8-jre (8.151.12-r0)
Executing busybox-1.27.2-r7.trigger
Executing ca-certificates-20171114-r0.trigger
Executing java-common-0.1-r0.trigger
OK: 81 MiB in 50 packages
Removing intermediate container f12eb4589a34
 ---> 82d9ecfcc95e
Step 4/4 : ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "Ave"]
 ---> Running in 28f2df6fb544
Removing intermediate container 28f2df6fb544
 ---> bbf098575e6a
Successfully built bbf098575e6a
Successfully tagged docker-hello-world:latest

按照@Siking 的建议执行命令

$docker run -it docker-hello-world:latest

这是输出的快照:

【讨论】:

  • @SiKing @dkb 我也有同样的问题Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory at Ave.main(Ave.java:19) Caused by: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory ... 1 more Caused by: java.lang.ClassNotFoundException: java.lang.invoke.StringConcatFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.Class.....
  • @YazeedAlqahhas,你的意思是,在我上面提到的尝试之后,你仍然面临问题?
  • @SiKing @dkb 是的,但我不知道 Docker 版本是否导致了这种情况。我的 Docker 版本是17.12.0-ce, build c97c6d6。另外,我的java版本是openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src) OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)
  • @YazeedAlqahhas,我认为您系统的 java 版本不是问题,因为 java 版本在映像中是 openjdk8-jre(如 Dockerfile 中所述)如果您认为 docker 版本是一个问题,最好升级和测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2011-01-31
相关资源
最近更新 更多