如何使用包名称为 java class 定义 Dockerfile?

How to define Dockerfile for java class with package name?

我在尝试 运行 一个简单的 java 文件时遇到了一个问题,该文件具有与之关联的包名称。我的文件是:

package com.example.springboot.folder.folder1;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

要编译上面的代码,我使用 javac HelloWorld.java 但要 运行 它我需要转到 \com 和 运行 java com.example.springboot.folder.folder1.HelloWorld 之前的文件夹结构,它工作正常.

我现在正在尝试使用 docker 文件构建并 运行 它,我当前的 docker 文件如下:

FROM alpine
WORKDIR /root/testdir
COPY HelloWorld.java /root/testdir

RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin


RUN javac HelloWorld.java
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"

与HelloWorld.java程序

同级

当我尝试使用 docker build . 和 运行 使用 docker run imageid 进行构建时,出现以下错误:

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld

任何人都可以帮助我解决可能出错的地方吗?

CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"

您可以简单地调用此命令:CMD java HelloWorld,运行 您在第一个命令后生成的 HelloWorld.class 文件将是什么:RUN javac HelloWorld.java.

但这不是一个好方法。您应该为 Docker 图像提供一个 jar 文件,然后调用此命令:CMD ["java", "-jar", "/HelloWorld.jar"]。 您需要打包您的项目并将其复制到您的 docker 图像中。

您需要保留包结构才能正常工作。 在您只需复制 java 源代码的地方,您需要复制整个目录才能正常工作。

您的 Dockerfile 应该如下所示:

FROM alpine
WORKDIR /root/testdir
ADD com /root/testdir/com

RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin

RUN javac com/example/springboot/folder/folder1/HelloWorld.java
CMD ["java", "com.example.springboot.folder.folder1.HelloWorld"]

当然,打包最好使用 .jar,所以按照 Harry Coder 提到的方法可能是最好的选择。