Thorntail结合Maven部署Rest服务时java.net.http模块未找到的咨询
针对Thorntail环境java.net.http模块缺失的可落地修复路径
前置校验(先排除最容易踩的基础错)
- 首先确认Thorntail服务实际运行的JDK版本:
java.net.http作为标准JDK内置包正式存在是从JDK11开始的,JDK8及以下版本根本没有对应的类定义,哪怕业务代码编译通过,运行环境版本不匹配的话,任何模块配置都无法生效。之前适配JDK9/10孵化阶段的jdk.incubator.httpclient方案,和正式版java.net.http的模块名、类结构完全不通用,错配必然直接报模块找不到的错误。 - 核对Thorntail打包插件绑定的运行时JDK版本,避免出现本地装了高版本JDK、但插件打出来的可启动包默认用JDK8运行的错配场景。
无额外模块定义的快速修复(不需要改动Thorntail内置目录结构)
这个方法的核心是绕开JBoss模块的类查找逻辑,让java.net.http类直接用JDK系统类加载器加载,跳过Thorntail对自定义模块的检索流程:
- 删除之前在
WEB-INF/jboss-deployment-structure.xml里所有对java.net.http的依赖声明,替换为以下配置:<jboss-deployment-structure> <deployment> <exclusions> <!-- 告诉JBoss模块体系不要检索这个模块,直接放行给JDK类加载器处理 --> <module name="java.net.http" /> </exclusions> </deployment> </jboss-deployment-structure> - 给Thorntail服务的启动命令添加JVM参数,激活JDK11以上内置的
java.net.http模块:--add-modules java.net.http
需保留模块化隔离的适配修复
如果业务场景必须走JBoss严格的模块类加载隔离机制,需要手动给Thorntail补缺失的模块定义文件(Thorntail本身已停止维护,内置模块清单没包含JDK11之后新增的JDK内置模块):
- 进入Thorntail运行时的模块存储目录,创建路径
system/layers/base/java/net/http/main - 在该路径下新建
module.xml,不需要额外放依赖jar,直接声明模块即可:<module xmlns="urn:jboss:module:1.3" name="java.net.http"> <dependencies> <module name="java.base" services="export"/> </dependencies> </module> - 补完模块定义后,再在
jboss-deployment-structure.xml里声明对java.net.http的依赖,就不会再触发模块找不到的错误。
兜底兼容方案
如果以上配置都因为Thorntail版本定制化改动无法生效,直接绕开JDK自带的HttpClient能力,把OkHttp、Apache HttpClient 5作为普通业务依赖打进WEB-INF/lib目录即可——Thorntail对应用自有lib目录下的类是默认全量加载的,完全不会走模块检索流程,兼容性最高。
内容的提问来源于stack exchange,提问作者warmy54
相关产品推荐
相关产品推荐

