使用jdeps构建Spring Boot最小JRE时提示java.annotation模块未找到
问题根因
java.lang.module.FindException: Module java.annotation not found:Java 9及以上版本已将java.xml.ws.annotation(包含java.annotation相关API)从标准模块中移除,而org.apache.tomcat.embed.core依赖仍在声明对该模块的需求。com.sun.tools.jdeps.MultiReleaseException:一方面是你使用的部分第三方依赖为多版本JAR,内置了适配不同Java版本的Class文件,jdeps无法自动兼容所有版本的类定义;另一方面是你之前的jdeps命令中--module-path target/lib/*写法错误,shell会将通配符展开为多个独立路径,导致jdeps参数解析异常。
修复方案
- 修正jdeps执行命令
替换原有命令为以下写法,补充缺失模块声明、修正路径参数:
jdeps \ --ignore-missing-deps \ --print-module-deps \ --multi-release 17 \ --class-path "target/lib/*" \ --add-modules java.xml.ws.annotation,jdk.unsupported \ target/errorrr-*.jar
如果使用Java 11,将--multi-release参数值改为11即可。
多版本JAR报错补充修复
如果执行上述命令仍抛出MultiReleaseException,可将--multi-release参数值改为base,强制jdeps使用JAR包的基础版本类文件进行分析,跳过版本适配的特殊类。构建最小JRE
拿到jdeps输出的模块依赖列表后,执行jlink命令生成自定义JRE,注意手动补充java.xml.ws.annotation模块:
jlink \ --no-header-files \ --no-man-pages \ --compress=2 \ --strip-debug \ --add-modules [jdeps输出的模块列表],java.xml.ws.annotation \ --output ./minimal-jre
按此方案构建的JRE体积可控制在80MB以内,和你不引入web依赖时的体积差异很小。
内容的提问来源于stack exchange,提问作者Bryan Motta
相关产品推荐
相关产品推荐

