AEM中MSSQL OSGI Bundle运行报错javax.net.SocketFactory类未找到问题咨询
问题根因
你遇到的java.lang.NoClassDefFoundError: javax/net/SocketFactory错误属于OSGi类加载机制下的系统包导入缺失问题,虽Manifest中显式声明了导入javax.net包,但实际运行时该依赖并未正确解析,核心诱因和对应解决方案如下:
解决方案
检查运行环境与执行环境声明的匹配度
你Manifest中声明的执行环境是JavaSE-1.8,但错误堆栈中的类路径前缀java.base/说明实际运行环境为Java 9及以上版本。Java 9引入模块化后,javax.net属于java.base模块的内置包,需确保OSGi容器已配置将该包作为系统包导出:
若你使用Felix等容器,可在启动配置的config.properties中添加:org.osgi.framework.system.packages.extra = javax.net,javax.net.ssl,javax.naming若在Adobe AEM/Granite环境运行,可通过OSGi控制台的「系统包导出」配置项添加上述包。
验证依赖解析状态
进入OSGi Gogo Shell执行以下命令排查:- 执行
ps获取你的MSSQL驱动Bundle的ID - 执行
headers <你的Bundle ID>查看Import-Package列表,确认javax.net的状态是否为resolved,若为unresolved说明无Bundle导出该包 - 执行
packages | grep javax.net确认系统Bundle是否已导出该包,若未导出则按上一步调整容器配置
- 执行
补充缺失的Bundle-ClassPath配置
你当前的Manifest中缺少Bundle-ClassPath声明,若你将官方MSSQL驱动JAR内嵌到了自定义Bundle中,必须显式指定类路径:Bundle-ClassPath: ., mssql-jdbc-<驱动版本号>.jar若使用maven-bundle-plugin构建,需在插件配置中添加
<Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath>,确保内嵌的JAR被正确加入类路径。临时验证方案
可先在Import-Package的javax.net声明后添加resolution:=optional标识,验证类加载逻辑是否正常:Import-Package: javax.net;resolution:=optional, 其余原有导入包该配置仅用于排查问题,正式环境不建议使用,避免后续其他依赖缺失问题被隐藏。
内容的提问来源于stack exchange,提问作者C. Rich

