如何为声明了包名的Java类编写可正常运行的Dockerfile
问题排查及修正方案
核心错误点
- 编译阶段未生成匹配包名的目录结构
带包声明的Java类编译后,必须存放在和包名层级完全一致的目录结构中才能被JVM加载。你直接执行javac HelloWorld.java生成的HelloWorld.class直接落在/root/testdir根目录下,没有生成com/example/springboot/folder/folder1层级目录,运行时自然找不到类。编译时需要加-d .参数让javac自动生成对应包目录。 - CMD指令语法错误
你当前的CMD写法混淆了类路径参数和主类参数,-cp后面仅允许填写类搜索路径,主类全限定名需要放在参数最后,多余的java前缀属于语法错误。
修正后完整Dockerfile
FROM alpine WORKDIR /root/testdir COPY HelloWorld.java /root/testdir RUN apk add --no-cache openjdk8 ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk ENV PATH $PATH:$JAVA_HOME/bin # 编译时加-d参数自动生成包目录结构 RUN javac -d . HelloWorld.java # 直接指定主类全限定名运行 CMD ["java", "com.example.springboot.folder.folder1.HelloWorld"]
注:使用exec数组格式写CMD可以避免shell解析带来的额外参数问题,稳定性更高。
内容的提问来源于stack exchange,提问作者s21s
相关产品推荐
相关产品推荐

