创建并运行带有包装的Java应用程序的Docker映像

问题描述 投票:0回答:1
Dockerfile HelloWorld.class HelloWorld.java

dockerfile:

FROM openjdk:11-jdk-slim WORKDIR /app COPY HelloWorld.java . RUN javac HelloWorld.java CMD ["java", "HelloWorld"]

java类:

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

这可以很好地工作

sudo docker build -t hello-world-java . sudo docker run hello-world-java

但是,如果我在文件夹内容中添加了类的软件包,并且该类:

java类:

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

符号

~/workspace/helloWorldPackage$ tree . ├── Dockerfile └── hello ├── HelloWorld.class └── HelloWorld.java 2 directories, 3 files

并修改Dockerfile,例如:

FROM openjdk:11-jdk-slim WORKDIR /app COPY hello/ . RUN javac HelloWorld.java CMD ["java", "hello.HelloWorld"]

我可以对其进行构建,但是当运行时,我会得到:

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

我在Dockerfile中尝试了几次修改,但无济于事。主要是在CMD上修改classPath,或在复制/工作迪尔中复制的内容,但我认为我不明白这些命令的功能。 CMD是否从WorkDir的文件夹内部运行?它如何与复制文件夹进行交互?和Java命令?我认为我缺乏使它起作用的东西。
我只能找到没有包装的Java Web应用程序或Java本地应用程序的教程或答案。 我期望与包装无爪哇应用程序所获得的相似行为。 IE。 Java的正确Dockerfile描述以捕获正确的类路径。

当您尝试启动
hello.HelloWorld

作为主要类时,JVM(除其他位置)查看了一个文件。 将文件复制到容器中时,您需要保持

hello/HelloWorld.class

结构。

线应包含整个目录。
java docker package dockerfile local
1个回答
0
投票
线应使用源文件的相对路径。 这看起来像

COPY
(对于任何较大的项目,您可能想要一个更实质性的构建系统,例如Maven或Gradle。对于Java,在Docker之外构建应用程序并不少见,并且仅将Jar文件置于图像中;或者如果您运行了该应用程序在Dockerfile中构建,请确保在标准项目布局中进行整个树。)
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.