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

如何在Docker中使用JRE 11运行Vert.x应用?

解决Docker部署Vert.x应用的版本兼容问题

方案1:使用支持Java11的Vert.x官方镜像

vertx/vertx3镜像从3.9版本开始提供Java11兼容的标签,直接选择带-jre11或-jdk11的镜像,即可同时满足Java11运行环境和Vert.x预装环境的需求。

Dockerfile示例:

# 选择适配Java11的Vert.x 3.x镜像
FROM vertx/vertx3:3.9.12-jre11

# 复制你的应用jar包到容器指定目录
COPY target/your-app-fat.jar /usr/vertx/app.jar

# 使用Vert.x命令启动MainVerticle
ENTRYPOINT ["vertx", "run", "com.yourpackage.MainVerticle", "-cp", "/usr/vertx/app.jar"]

说明:

  • 替换3.9.12-jre11为你需要的Vert.x 3.x版本(需确保版本≥3.9,支持Java11)
  • your-app-fat.jar是包含所有依赖的可执行胖jar(Maven可通过maven-shade-plugin生成,Gradle用shadowJar插件)
  • 若使用Vert.x自带的启动器,也可将启动命令改为ENTRYPOINT ["java", "-jar", "/usr/vertx/app.jar"]

方案2:打包胖jar,基于纯JRE11镜像运行

如果不需要依赖Vert.x官方镜像,可将应用打包成包含所有依赖(包括Vert.x核心库)的胖jar,直接用JRE11镜像运行,无需容器内预装Vert.x环境。

Dockerfile示例:

# 基于AdoptOpenJDK 11 JRE镜像
FROM adoptopenjdk:11-jre-hotspot

# 创建应用工作目录
WORKDIR /app

# 复制胖jar到容器
COPY target/your-app-fat.jar app.jar

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

说明:

  • 构建时必须生成胖jar,确保所有依赖(包括Vert.x)被打包进一个文件,避免运行时缺失依赖
  • 这种方式灵活性更高,不受Vert.x官方镜像的版本限制

方案3:适配Java8环境(仅当必须兼容Java8时使用)

如果一定要用Java8运行,需要解决API兼容性问题:

  1. 严格保持编译和运行时的Vert.x版本一致,避免因版本差异导致NoSuchMethodError
  2. 将HttpServer.listen的Future风格调用替换为Java8兼容的Handler回调风格,示例:
    // 原Future风格调用(Java8环境的旧版Vert.x可能不支持)
    vertx.createHttpServer().listen(8080)
        .onSuccess(server -> System.out.println("Server started"))
        .onFailure(err -> err.printStackTrace());
    
    // 替换为Java8兼容的Handler风格
    vertx.createHttpServer().listen(8080, res -> {
        if (res.succeeded()) {
            System.out.println("Server started");
        } else {
            res.cause().printStackTrace();
        }
    });
    
  3. 使用vertx/vertx3:3.x.x-jre8镜像部署,确保编译时使用Java8,且依赖的Vert.x版本与镜像内置版本完全匹配

内容的提问来源于stack exchange,提问作者Anton Schillén

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:25