java 使用Dockerfile在Docker容器中设置CLASSPATH

6tqwzwtp  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(387)

我一直在尝试“dockerize”我用java构建的微服务。但是,我在使用Docker时遇到了一些类路径问题。我在Linux机器上使用java open jdk 1。8.我的dockerfile看起来像这样:

FROM openjdk:version

#`Make the directories I need
RUN mkdir -p /opt/service/libs

ENV LIBS_PATH=/opt/service/libs
ENV CLASSPATH=LIBS_PATH"/*"

COPY ./target/libs $LIBS_PATH
COPY ./target/MY_SERVICE.jar $LIBS_PATH

ENTRYPOINT java -cp $CLASSPATH "com.org.service.mainClass"

我注意到,当我这样做时,我在docker容器中回显$CLASSPATH(使用docker run),它返回jar文件的所有地址,但中间有一个空格而不是:这意味着两件事,它知道所有这些jar文件在哪里,并且jar文件已经成功复制。我仍然在java -cp行上得到一个错误。错误如下:
错误:无法找到或加载主类。opt.service.libs.FirstJarInLibsFolder.jar
如果我将CLASSPATH更改为:分隔符,则会得到错误:
错误:找不到或加载主类com。org.service.mainClass
即使我的JAR包含了这个类。
有没有想过可能是什么?
我试过上面详细的内容。

qni6mghb

qni6mghb1#

这一行看起来不正确:

ENV CLASSPATH=LIBS_PATH"/*"

它可能应该在变量名前有一个$,另见Dockerfile参考。

ENV CLASSPATH=$LIBS_PATH"/*"

此外,为了安全起见,你应该在java -cp参数周围加上引号:

ENTRYPOINT java -cp "$CLASSPATH" "com.org.service.MainClass"

(As注解中提到的,这也使用了正确的大写字母MainClass
当我这样做并在docker容器内部回显$CLASSPATH时(使用docker run),它返回jar文件的所有地址,但中间有一个空格
这可能在shell中为类路径中的*执行通配符扩展;你必须运行echo "$CLASSPATH"(带引号)来防止这种情况,并验证路径是否正确。通配符扩展的结果可能不一定与java的行为相同。例如,在this question中,shell将扩展*.jar,但将其传递给java -cp将不起作用,您将不得不只使用*(正如您所做的)。

相关问题