Java8升级Java11时sun.net.www.protocol.https包不可见如何获取HTTPS handler
Java 11 HTTPS Handler 正确获取方案
Java 9 引入模块系统后,所有sun.*前缀的包都被划为JDK内部私有API,默认不对外暴露,因此Java 11环境下直接引用sun.net.www.protocol.https.Handler会触发包不可见的报错。
对应解决方案如下:
- 推荐方案:省略Handler参数,依赖JDK自动加载
绝大多数场景不需要显式指定HTTPS Handler,JDK会自动根据URL的https协议前缀匹配内置的Handler,原有代码可以直接简化为:
如果需要配置SSL连接参数、证书校验规则等,直接对打开的连接操作即可:URL url = new URL(strServletUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); // 后续完成连接配置、请求发起逻辑 - 特殊场景兼容方案
如果原有代码逻辑必须保留URL构造方法的第三个Handler参数(比如需要统一处理自定义协议逻辑),可以自行实现符合URLStreamHandler规范的HTTPS Handler,或者通过标准服务加载接口获取JDK内置的Handler实现,完全规避对sun.*包的依赖。 - 临时过渡方案(不推荐长期使用)
如果暂时没有时间重构代码,可以添加JVM启动参数强制暴露对应内部包,临时兼容旧代码:
注意该方案仅作为短期过渡使用,后续JDK版本可能会直接删除该内部类,导致代码完全无法运行。--add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED
内容的提问来源于stack exchange,提问作者Viishwaas Sinha
相关产品推荐
相关产品推荐

