You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建含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"]
关键修改说明
  1. 修正了原Dockerfile中curl的URL空格错误,避免下载失败;
  2. 原CMD中的/opt/jboss/mystifly为笔误,已调整为与JBOSS_HOME一致的路径;
  3. 运行阶段强制使用JDK14环境,确保能加载Java14编译的类文件。

内容的提问来源于stack exchange,提问作者sujith M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:05:37