我一直在尝试“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包含了这个类。
有没有想过可能是什么?
我试过上面详细的内容。
1条答案
按热度按时间qni6mghb1#
这一行看起来不正确:
它可能应该在变量名前有一个
$
,另见Dockerfile参考。此外,为了安全起见,你应该在
java -cp
参数周围加上引号:(As注解中提到的,这也使用了正确的大写字母
MainClass
)当我这样做并在docker容器内部回显$CLASSPATH时(使用docker run),它返回jar文件的所有地址,但中间有一个空格
这可能在shell中为类路径中的
*
执行通配符扩展;你必须运行echo "$CLASSPATH"
(带引号)来防止这种情况,并验证路径是否正确。通配符扩展的结果可能不一定与java
的行为相同。例如,在this question中,shell将扩展*.jar
,但将其传递给java -cp
将不起作用,您将不得不只使用*
(正如您所做的)。