【问题标题】:Docker can't find my .java files in an IntelliJ project setupDocker 在 IntelliJ 项目设置中找不到我的 .java 文件
【发布时间】: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


【解决方案1】:

尝试将 Dockerfile 上的 RUN 和 CMD 命令更改为

RUN javac com/comapny/*.java
CMD java -cp . com.company.Main

我假设 Main 位于 com.company 包下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多