【发布时间】:2021-05-27 11:29:46
【问题描述】:
我有一个在 IntelliJ 上创建的 Java 项目。 The file structure, which is simply the default set by IntelliJ, looks like this:
我想为整个项目构建一个 Docker 镜像(Main 类从根文件夹中的 driver-info.txt 文件中获取输入),并将其推送到 Docker Hub。
我在根文件夹中创建了一个没有文件扩展名的 Dockerfile,我在其中粘贴了(这直接来自我的课程资料):
FROM openjdk:11
WORKDIR /app
COPY . /app
RUN javac *.java
CMD java Main
然后我转到命令终端并 cd 到该项目的根目录(即 C:\Users\User-PC\IdeaProjects\Task_11_Capstone>)。我在那里输入(也直接从我的课程材料中粘贴):
docker build -t java-app ./
它构建了第 1 步和第 2 步,但在第 3 步时出错,提示:
=> ERROR [4/4] RUN javac *.java 0.4s
------
> [4/4] RUN javac *.java:
#8 0.363 error: file not found: *.java
#8 0.363 Usage: javac <options> <source files>
#8 0.363 use --help for a list of possible options
------
executor failed running [/bin/sh -c javac *.java]: exit code: 2
我认为 Docker 在 src/com/company 文件夹中查找我的 java 文件存在问题(请参阅我分享的有关项目文件结构的图像)。根据 StackOverflow 上的其他文章,我尝试更改路径名,并尝试使用完全限定名称。但他们都给了我同样的错误信息。
我还尝试在其他类旁边的 src/com.company 文件夹中找到 Dockerfile inside。但随后它将 Dockerfile “COPY”语句重构为 COPY ../../.. /app。我认为这是正确的,因为我确实想将根文件夹中的所有项目(包括 .txt 文件)复制到我的图像中。
然后我 cd 到 Dockerfile 现在所在的文件夹(即 C:\Users\User-PC\IdeaProjects\Task_11_Capstone\src\com\company)来构建映像。这是正确的还是我应该留在项目根文件夹中?无论如何,这样做确实可以让我成功构建图像。 (我认为 - this is what it shows)。
但是,当需要运行映像时,我又卡住了。我在命令行中输入以下内容(直接取自我的课程资料):
docker run java-app
它给了我这个错误信息:
Error: Could not find or load main class Main
Caused by: java.lang.NoClassDefFoundError: com/company/Main (wrong name: Main)
换句话说,如果我将 Dockerfile 放在 java 文件所在的位置,它似乎仍然找不到它们。
我尝试过 Docker Hub 论坛 Stackoverflow,收到了超过 10 封来回支持 IntelliJ 的电子邮件,并与我的课程导师进行了屏幕共享,但我们无法弄清楚它为什么无法运行。我还卸载了 Docker 并重新安装了它,并创建了一个没有 com.company 包的项目版本。
另一方面,我已经成功地构建、运行和推送了其他 Docker 镜像,特别是一个网站和一个简单的 java 程序。然而,只有在我的 IntelliJ 项目中尝试这样做时,它才会给我这些问题。可能值得注意的是,这也是一个连接到 GitHub 的 Git 存储库。
对我接下来可以尝试什么有什么想法吗?
【问题讨论】:
-
我认为你把事情搞混了,你缺乏一些基础知识。您必须了解用于 xample 的包,以及
com.company.Main与名为Main的类不同。这也意味着您不了解类路径是什么。所以,对我来说,听起来你应该先学习所有这些 java 基础知识,然后再添加 docker 映像的额外复杂性。 -
你真的有一个名为 * 的文件吗? javac *.java 正在寻找一个名为 *.java 的文件,而不是“所有扩展名为 .java 的文件”
-
另一部分:任何现实世界的项目都应该只使用
javac *.java构建......你宁愿使用像 gradle 或 maven 这样的工具。而且此类工具通常支持将交付内容转换为 docker 映像,只是说。您正在尝试在这里重新发明轮子... -
请注意:如果您采用自己的方法,请先不使用 docker。含义:只需编写一个 SHELL 脚本来运行 javac 并运行您的代码。如前所述:你得到那些基本的命令行东西已经错了。没有必要问“我骑自行车时如何杂耍”......当单独杂耍已经给你带来麻烦时。
-
嗨@Stultuske 哦,我明白了,我认为使用 * 就像所有 .java 文件的占位符。我有大约 5 个带有 .java 扩展名的文件,但它们都有不同的名称。编译的时候要不要一一列出来?
标签: java docker intellij-idea dockerfile