用Docker编译Java项目

用Docker编译Java项目,java,docker,Java,Docker,我是新来的码头工人。我在使用外部库编译代码时遇到问题 有一个存放库的lib文件夹(与“src”文件夹级别相同),例如abc.jar。我修改了Dockerfile,如下所示。它编译时没有错误,但项目不是用abc.jar构建的 # Compile our java files in this container FROM openjdk:17-slim AS builder COPY src /usr/src/project/src COPY lib /usr/src/project/lib COP

我是新来的码头工人。我在使用外部库编译代码时遇到问题

有一个存放库的lib文件夹(与“src”文件夹级别相同),例如abc.jar。我修改了Dockerfile,如下所示。它编译时没有错误,但项目不是用abc.jar构建的

# Compile our java files in this container
FROM openjdk:17-slim AS builder
COPY src /usr/src/project/src
COPY lib /usr/src/project/lib
COPY manifest.txt /usr/src/project/manifest.txt
WORKDIR /usr/src/project
RUN find . -name "*.java" | xargs javac -cp lib/abc.jar -d ./target
RUN jar cfm my_project.jar manifest.txt -C ./target/ .

# Copy the jar and test scenarios into our final image
FROM openjdk:17-slim
WORKDIR /usr/src/project
COPY --from=builder /usr/src/project/my_project.jar ./my_project.jar
manifest.txt已被删除

Main-Class: Main
Class-Path: lib/abc.jar
任何帮助都将不胜感激


谢谢。

当您使用库编译项目时,不会将其包含在最终图像中。 在多阶段构建中,每个阶段从一个基本映像(
openjdk:17 slim
在本例中)开始
,除非复制到库上,否则最终映像将不包含它

这就是如何做到这一点:

#将jar和测试场景复制到最终图像中
来自openjdk:17 slim
WORKDIR/usr/src/project
复制--from=builder/usr/src/project/my_project.jar./my_project.jar
复制--from=builder/usr/src/project/lib/abc.jar./lib/abc.jar
运行java-jar my_project.jar

使用库编译项目时,不会将其包含在最终映像中。 在多阶段构建中,每个阶段从一个基本映像(
openjdk:17 slim
在本例中)开始
,除非复制到库上,否则最终映像将不包含它

这就是如何做到这一点:

#将jar和测试场景复制到最终图像中
来自openjdk:17 slim
WORKDIR/usr/src/project
复制--from=builder/usr/src/project/my_project.jar./my_project.jar
复制--from=builder/usr/src/project/lib/abc.jar./lib/abc.jar
运行java-jar my_project.jar

你所说的“不是用abc.jar构建的”是什么意思?当我在abc.jar中调用类时运行程序时,我遇到了ClassNotFound异常。另外,我使用“jar-tf my_project.jar”来查看项目结构,在我的项目中看不到lib/abc.jar。除非您显式地创建一个胖jar(例如,通过Maven/Gradle),否则Java不会这样工作。您应该将abc.jar复制到目标图像,并在运行jar时将其添加到类路径。嗨,Sokolov,谢谢您的帮助。你能详细说明一下如何做到这一点吗?你说的“不是用abc.jar构建的”是什么意思?我在abc.jar中调用类时运行程序时遇到了ClassNotFound异常。另外,我使用“jar-tf my_project.jar”来查看项目结构,在我的项目中看不到lib/abc.jar。除非您显式地创建一个胖jar(例如,通过Maven/Gradle),否则Java不会这样工作。您应该将abc.jar复制到目标图像,并在运行jar时将其添加到类路径。嗨,Sokolov,谢谢您的帮助。你能详细说明一下怎么做吗?这很有效!感谢你的帮助,塔索斯。它很有效!谢谢你的帮助,塔索斯。