使用 Dockerfile 在 Docker 容器中设置 CLASSPATH

问题描述 投票:0回答:1

我一直在尝试将我使用 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 包含那个类。

有什么想法吗?

我已经尝试了上面详述的内容。

java docker jar dockerfile classpath
1个回答
0
投票

这条线看起来不正确:

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
将不起作用,您将只能使用
*
(正如您所做的那样)。

© www.soinside.com 2019 - 2024. All rights reserved.