原博客地址:http://www.cnblogs.com/wsygdb/p/7890237.html
報錯原因:JDK從1.8升級到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用
描述
最近研究把項目的JDK升級從1.8升級到9.0.1,在eclipse上配置好JDK為9后,發現項目有錯,查看發現sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用。
原因分析
參看官網,發現JDK中的lib\tools.jar和JRE中的lib\rt.jar已從Java SE 9中刪除。這些JAR中可用的類和資源現在以文件中的內部格式存儲在lib目錄的命名模塊中。 可以使用稱為jrt的新方案來從運行時映像檢索這些類和資源。 依靠這些JAR位置的應用程序將不再工作。(http://www.oracle.com/technetwork/java/javase/9-relnote-issues-3704069.html)
處理辦法
從官網發現,從JDK 1.8開始,就提供了java.util.Base64.Decoder和java.util.Base64.Encoder的JDK公共API,可代替sun.misc.BASE64Decoder和sun.misc.BASE64Encoder的JDK內部API。我把代碼做了如下替換:
java.util.Base64.Decoder的官網API:https://docs.oracle.com/javase/9/docs/api/java/util/Base64.Decoder.html
java.util.Base64.Encoder的官網API:https://docs.oracle.com/javase/9/docs/api/java/util/Base64.Encoder.html
/**
* BASE64Encoder 加密
*
* @param data
* 要加密的數據
* @return 加密后的字符串
*/
public static String encryptBASE64(byte[] data) {
// BASE64Encoder encoder = new BASE64Encoder();
// String encode = encoder.encode(data);
// 從JKD 9開始rt.jar包已廢除,從JDK 1.8開始使用java.util.Base64.Encoder
Encoder encoder = Base64.getEncoder();
String encode = encoder.encodeToString(data);
return encode;
}
/**
* BASE64Decoder 解密
*
* @param data
* 要解密的字符串
* @return 解密后的byte[]
* @throws Exception
*/
public static byte[] decryptBASE64(String data) throws Exception {
// BASE64Decoder decoder = new BASE64Decoder();
// byte[] buffer = decoder.decodeBuffer(data);
// 從JKD 9開始rt.jar包已廢除,從JDK 1.8開始使用java.util.Base64.Decoder
Decoder decoder = Base64.getDecoder();
byte[] buffer = decoder.decode(data);
return buffer;
}