Java Maven集成PayPal支付遇HelloExtension类缺失错误求助
这个错误核心是sun/security/ssl/HelloExtension属于JDK内部非公开API,在JDK 8不同更新版本中,该类的存在形式、访问权限有变化,再加上GlassFish的NPN(Next Protocol Negotiation)组件可能和JDK的SSL实现冲突,最终导致类加载失败。结合你的环境(NetBeans 8.2、JDK 8、GlassFish 5.x、PayPal集成项目),以下是针对性排查修复步骤:
匹配JDK与GlassFish的兼容版本
GlassFish 5.0官方推荐JDK 8u141及以上,但JDK 8u261之后版本对内部API的访问限制大幅收紧,sun.security.ssl下的类被进一步封装。你降级到u151、u181未解决问题,大概率是GlassFish的NPN组件和这些JDK版本的SSL实现不兼容。建议直接使用GlassFish 5.0官方指定的JDK 8u141版本测试,不要跨版本跳级。清理Maven依赖冲突
集成PayPal时引入的依赖(如Apache HttpClient、PayPal SDK自带SSL库)可能和GlassFish自带的Grizzly NPN组件冲突:- 打开项目
pom.xml,查找所有含ssl、grizzly、npn关键字的依赖,排查重复或版本不匹配项; - 给GlassFish相关依赖添加
<scope>provided</scope>,避免Maven将其打包到WAR包,和服务器自带组件冲突; - 确认PayPal SDK版本,选用兼容JDK 8和GlassFish 5的版本,比如
paypal-rest-api-sdk的1.14.0~1.19.0区间版本(避免用太新的版本引发API不兼容)。
- 打开项目
调整GlassFish的JVM参数放宽内部API访问
JDK 8u161之后默认开启--illegal-access=deny限制访问内部API,可在GlassFish的domain.xml中修改JVM参数:
找到<jvm-options>节点,添加:--add-opens=java.base/sun.security.ssl=ALL-UNNAMED --add-opens=java.base/sun.security.ssl.SSLExtension=ALL-UNNAMED修改后重启GlassFish再测试支付流程。
彻底清理并替换GlassFish的NPN组件
你之前移除grizzly-npn-bootstrap.jar中的sun文件可能操作不彻底,或GlassFish仍在加载旧组件:- 找到GlassFish安装目录下的
glassfish/modules文件夹,删除所有含npn的jar包; - 下载与当前JDK 8版本兼容的
grizzly-npn-bootstrap包(比如JDK 8u181对应npn-bootstrap-1.1.1.v20180917); - 将新包替换到modules目录,重启服务器。
- 找到GlassFish安装目录下的
改用JDK原生SSL实现替代GlassFish NPN
若以上方法无效,可禁用GlassFish自带的NPN组件,改用JDK原生SSL:
在domain.xml的<network-listener>节点添加ssl-enabled="true",配置JDK的SSL证书,同时移除所有和NPN相关的配置参数。
内容的提问来源于stack exchange,提问作者user19914311

