【问题标题】:Compiling and running java with external libraries in dockerfile使用 dockerfile 中的外部库编译和运行 java
【发布时间】:2019-10-25 00:55:53
【问题描述】:

我正在努力使用 docker 编译和运行 java 文件。我有文件结构:

./Repo/
   Dockerfile
   ./libs/
      org.json.jar
   ./out/
      Program.class
   ./src/
      Program.java

我的 Dockerfile 看起来像这样:

FROM java:8-jdk-alpine

COPY /src /src/
COPY /out /out/
COPY /libs /libs/

RUN javac ..
CMD java ..

我希望能够在使用外部库时编译 src 中的文件并输出它们 我设法做到这一点的唯一方法是首先将 CD 放入 /src/ 并运行以下命令:

javac -d ../out -cp ../libs/org.json.jar Program.java

但肯定有办法从 Dockerfile 所在的目录中执行此操作吗?

javac -d /out -cp /libs/org.json.jar /out/Program.java

下一个问题是运行上述程序所需的 CMD。我不知道怎么写。

或者我应该将json lib复制到编译程序所在的out文件夹并运行以下CMD:

java -cp "org.json.jar;" Server

【问题讨论】:

  • 容器中不需要 src Java 文件...为什么不直接使用 Maven 或 Gradle 构建具有库依赖项的容器?
  • 所以将它们编译出来并只复制 OUT 和 LIBS 文件夹?不幸的是,我不能使用 Gradle 或 Maven。不过,我如何仍然在 docker 中使用 CMD 运行程序?如果外部 .jar 位于不同的目录中,还是应该将 .jar 复制到 out 中?
  • 你甚至不能使用Maven容器来构建一个项目,例如?抱歉,我没看到你在容器中运行 javac
  • 很遗憾我不能使用Maven,我需要在dockerfile中使用javac和java
  • 好吧,我不确定我是否理解限制。只要容器运行,谁会知道FROM mavenFROM java 之间的区别?

标签: java json docker dockerfile


【解决方案1】:

您正在尝试从 /out 路径而不是 src 编译 Program.java 文件,这可能是它不起作用的原因。

试试这个

RUN javac -d /out -cp /libs/*.jar /src/Program.java

然后你不需要复制文件夹,因为它会在容器构建时创建。当你运行docker build 时,应该会编译


否则尝试在容器外运行 javac,/out 和 /src 在你的源机器上不存在,所以你必须在命令中使用相对路径,然后将 out 文件夹 only 复制到Dockerfile 并删除 javac 使用(并切换到使用 JRE 映像)

【讨论】:

  • 在 Repo 目录中运行它会给我错误:javac: file not found: \src\Program.java Usage: javac 使用 -help 获取可能的选项列表
  • 你不需要从 repo 运行它。它在容器构建时运行......我很困惑最终目标是什么,但看起来你已经在本地安装了Java,那么为什么你需要在容器中做javac?
  • 啊,明天有机会我会测试这个,我家里没有安装docker。我正在使用 docker 映像的构建来编译 java.util.如果我想在使用 docker-compose up 程序时执行程序,我将使用什么 CMD 来运行带有 .jar 的 java
  • ENTRYPOINT ["java"] CMD ["-cp", "/libs/*.jar:/out", "Program"]
  • 它被添加到 CMD 的任何参数之前。更多信息可以参考 Docker 文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多