我一直在尝试将我使用 java 构建的微服务“dockerize”。但是,我在使用 Docker 时遇到了一些类路径问题。我在使用 java open jdk 1.8 的 Linux 机器上。我的 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 包含那个类。
有什么想法吗?
我已经尝试了上面详述的内容。
这条线看起来不正确:
ENV CLASSPATH=LIBS_PATH"/*"
它应该在变量名之前有一个
$
,另请参阅Dockerfile reference。
ENV CLASSPATH=$LIBS_PATH"/*"
此外,为了安全起见,您应该在
java -cp
参数周围加上引号:
ENTRYPOINT java -cp "$CLASSPATH" "com.org.service.MainClass"
(如评论中所述,这也使用了
MainClass
的正确大写)
当我这样做并回显 docker 容器内的 $CLASSPATH(使用 docker run)时,它返回 jar 文件的所有地址,但中间有一个空格
这可能在 shell 中为类路径中的
*
执行通配符扩展;你必须运行echo "$CLASSPATH"
(带引号)来防止这种情况并验证路径是否正确。通配符扩展的结果不一定与java
的行为方式相同。例如,如this question中所示,外壳将扩展*.jar
就好了,但是将其传递给java -cp
将不起作用,您将只能使用*
(正如您所做的那样)。