如何在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兼容性问题:
- 严格保持编译和运行时的Vert.x版本一致,避免因版本差异导致
NoSuchMethodError - 将
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(); } }); - 使用
vertx/vertx3:3.x.x-jre8镜像部署,确保编译时使用Java8,且依赖的Vert.x版本与镜像内置版本完全匹配
内容的提问来源于stack exchange,提问作者Anton Schillén
相关产品推荐
相关产品推荐

