在JBoss EAP 8.0.0中注册SQL Server驱动失败,提示依赖缺失
问题背景
在JBoss EAP 8.0.0环境中注册SQL Server驱动,执行CLI命令后触发报错:WFLYJCA0115: Module for driver [com.microsoft.sqlserver] or one of it dependencies is missing: [com.microsoft.sqlserver]。已在<server home>/modules/com/microsoft/sqlserver/main目录放置module.xml及对应JDBC JAR包,初始配置javax.transaction.api和javax.api依赖,替换为jakarta依赖后问题仍存在;相同配置在Windows环境可正常运行,且Oracle驱动用相同依赖注册无异常。
排查与解决步骤
1. 修正Linux环境的文件权限与路径大小写
Linux是大小写敏感系统,需确保:
- 模块路径
<server home>/modules/com/microsoft/sqlserver/main的目录名完全小写,不能出现大写字母(Windows不校验大小写,Linux会严格匹配) - 给JBoss运行用户赋予JAR包和
module.xml的读权限,执行命令:chown -R jboss:jboss <server home>/modules/com/microsoft/sqlserver chmod -R 644 <server home>/modules/com/microsoft/sqlserver/main/*
2. 适配JBoss EAP 8的Jakarta规范调整Module.xml
JBoss EAP 8基于Jakarta EE 9,原javax.*模块已被jakarta.*替代,需更新module.xml的命名空间与依赖:
<?xml version="1.0" ?> <module xmlns="urn:jboss:module:2.0" name="com.microsoft.sqlserver"> <resources> <resource-root path="mssql-jdbc-13.2.0.jre11.jar"/> </resources> <dependencies> <module name="jakarta.transaction.api"/> <module name="jakarta.api"/> <!-- SQL Server JDBC 13.x额外依赖 --> <module name="jakarta.xml.bind.api"/> <module name="org.slf4j"/> </dependencies> </module>
- 命名空间从
urn:jboss:module:1.9升级为urn:jboss:module:2.0(适配EAP 8模块规范) - 替换所有
javax.*依赖为jakarta.* - 添加
jakarta.xml.bind.api和org.slf4j:SQL Server JDBC 13.x版本依赖这两个模块,Oracle驱动无此需求
3. 验证JDBC版本兼容性
确保mssql-jdbc-13.2.0.jre11.jar与JBoss EAP 8的JDK版本匹配(EAP 8默认要求JDK 11+),若仍有问题,可尝试升级到mssql-jdbc-12.4.2.jre11.jar或更高版本(部分旧版本对Jakarta环境支持不完善)
4. 重新加载模块并执行CLI命令
- 重启JBoss服务器,确保新模块被加载
- 先验证模块是否存在:
若返回模块信息,再执行驱动添加命令:module list --name=com.microsoft.sqlserver/subsystem=datasources/jdbc-driver=sqlserver:add(driver-name="sqlserver", driver-module-name="com.microsoft.sqlserver", driver-class-name="com.microsoft.sqlserver.jdbc.SQLServerDriver")
5. 查看日志定位隐藏依赖问题
若问题依旧,查看JBoss的standalone.log或domain.log,查找更详细的依赖缺失信息,可能存在未配置的隐藏依赖(如jakarta.servlet.api)
关键提示
Windows系统不校验路径大小写,所以大小写错误不会触发问题,但Linux会严格校验;Oracle驱动的依赖需求与SQL Server不同,因此相同配置在Oracle上可行不代表适用于SQL Server。
内容的提问来源于stack exchange,提问作者Nathan

