构建含Java14、Maven、JBoss的Docker镜像时Java版本兼容问题求助
问题分析
报错信息明确指向编译与运行环境的JDK版本不兼容:
deployment.app-0.0.1-SNAPSHOT.war from Service Module Loader): com/m/service/TServiceImpl has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0
其中class文件版本58对应Java14,52对应Java8。你的Dockerfile运行阶段使用jboss/wildfly:14.0.1.Final作为基础镜像,它默认搭载Java8,即便手动下载了WildFly19,也未替换基础镜像的JDK版本,导致运行时用Java8加载Java14编译的类文件,触发版本不匹配错误。
解决方案
以下两种方案均可解决问题,推荐方案一(更简洁,避免手动配置的潜在错误):
方案一:直接使用带JDK14的WildFly官方镜像
官方WildFly镜像提供了对应JDK版本的标签,直接选用WildFly19.0.0.Final搭配JDK14的镜像,无需手动安装WildFly和JDK:
# 构建阶段:用JDK14的Maven镜像编译项目 FROM maven:3.6.3-jdk-14 as BUILD COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN mvn clean install # 运行阶段:使用带JDK14的WildFly19官方镜像 FROM wildfly:19.0.0.Final-jdk14 ENV JBOSS_HOME /opt/jboss/wildfly # 复制编译好的war包到部署目录 COPY --from=BUILD /usr/src/myapp/app/target/app-0.0.1-SNAPSHOT.war ${JBOSS_HOME}/standalone/deployments/ # 复制自定义启动脚本与配置(按需保留) ADD standalone.sh ${JBOSS_HOME}/bin/ ADD standalone.conf ${JBOSS_HOME}/bin/ # 暴露端口 EXPOSE 8080 9990 9999 9000 # 设置启动命令 USER jboss CMD ["bash", "${JBOSS_HOME}/bin/standalone.sh", "-b", "0.0.0.0"]
方案二:基于JDK14基础镜像手动安装WildFly19
若需完全自定义环境,可基于OpenJDK14镜像手动安装WildFly19,确保运行环境JDK版本为14:
FROM maven:3.6.3-jdk-14 as BUILD COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN mvn clean install # 用OpenJDK14作为基础镜像 FROM openjdk:14-jdk ENV m_VERSION 19.0.0.Final ENV m_SHA1 0d47c0e8054353f3e2749c11214eab5bc7d78a14 ENV JBOSS_HOME /opt/jboss/wildfly ENV CERT_HOME /usr/lib/jvm/java-14-openjdk-amd64/lib/security USER root # 修正原URL空格错误,安装WildFly19 RUN cd /opt/jboss \ && curl -O https://download.jboss.org/wildfly/${m_VERSION}/wildfly-${m_VERSION}.tar.gz \ && sha1sum wildfly-${m_VERSION}.tar.gz | grep ${m_SHA1} \ && tar xf wildfly-${m_VERSION}.tar.gz \ && mv wildfly-${m_VERSION} ${JBOSS_HOME} \ && rm wildfly-${m_VERSION}.tar.gz \ && chown -R jboss:0 ${JBOSS_HOME} \ && chmod -R g+rw ${JBOSS_HOME} # 创建jboss用户(基础镜像默认无此用户) RUN useradd -m jboss ENV LAUNCH_JBOSS_IN_BACKGROUND true USER jboss EXPOSE 8080 9990 9999 9000 COPY --from=BUILD /usr/src/myapp/app/target/app-0.0.1-SNAPSHOT.war ${JBOSS_HOME}/standalone/deployments/ ADD standalone.sh ${JBOSS_HOME}/bin/ ADD standalone.conf ${JBOSS_HOME}/bin/ # 修正原CMD中的路径笔误 CMD ["bash", "${JBOSS_HOME}/bin/standalone.sh", "-b", "0.0.0.0"]
关键修改说明
- 修正了原Dockerfile中
curl的URL空格错误,避免下载失败; - 原CMD中的
/opt/jboss/mystifly为笔误,已调整为与JBOSS_HOME一致的路径; - 运行阶段强制使用JDK14环境,确保能加载Java14编译的类文件。
内容的提问来源于stack exchange,提问作者sujith M
相关产品推荐
相关产品推荐

