Docker运行失败并显示NoClassDefFoundError-即使相关的jar位于类路径中

时间:2019-11-13 19:08:23

标签: java docker

我是docker新手。我试图在容器中运行Java类。 我的主要课程取决于当地的罐子。能够将罐子添加到Docker映像 并可以将jar设置在类路径中。

但是,仍然可以在运行容器时失败,并显示“线程“ main”中的异常java.lang.NoClassDefFoundError”

我的Dockerfile

FROM java:8

WORKDIR /

ADD Test.jar Test.jar

ADD Dependant.jar Dependant.jar

RUN mkdir /usr/myjars

COPY /Dependant.jar /usr/myjars/Dependant.jar

ENV CLASSPATH .:/usr/myjars/Dependant.jar

RUN export CLASSPATH=.:/usr/myjars/Dependant.jar

CMD ["java",  "-jar", "Test.jar"]

请帮助我确定问题

2 个答案:

答案 0 :(得分:0)

您的Dockerfile比所需的复杂。您可以:

FROM java:8

COPY Test.jar /

ENV CLASSPATH=/usr/myjars
RUN mkdir -p ${CLASSPATH}
COPY Dependant.jar ${CLASSPATH}

# You need the SHELL form of CMD or ENTRYPOINT because you're using ENV
ENTRYPOINT java -jar /Test.jar

我还没有尝试过,但是希望它能起作用|帮助!

答案 1 :(得分:0)

通常,当我们尝试从JAR文件运行Java类时, JVM不会考虑环境CLASSPATH。相反,它将在jar中查找清单文件的类路径定义。

引用:https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

考虑到此情况,我已使用以下清单纠正了我的CheckSum.jar / Dependant.jar的创建。

  

MANIFEST.MF

Manifest-Version: 1.0
Class-Path: . /usr/myjars/PaytmChecksum.jar
Main-Class: TestChecksumGeneration

以下是我更正后的Docker文件。

  

Dockerfile

FROM java:8

COPY CheckSum.jar /

ENV JARDIR=/usr/myjars

RUN mkdir -p ${JARDIR}

COPY PaytmChecksum.jar ${JARDIR}

ENTRYPOINT java -jar /CheckSum.jar

注意:我尚未向我的Docker容器提供任何CLASSPATH