解决rt.jar下sun.misc.BASE64Encoder的依赖

1. 描述

当使用maven进行打war包时,可能会出现cannot find symbolsun.misc.BASE64Encoder找不到jar包


2. 分析

原因在于BASE64Encoder/BASE64Decoder类在sun.misc包下,是sun公司的内部方法,后期有删除的潜在可能,建议使用apache commons.codec下的Base64替代或者jdk自带的java.util.Base64.Decoder和java.util.Base64.Encoder的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

3. 解决方法

方法一、利用JDK替代sun.misc.BASE64Encoder
替代前:

package util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WidthCodedPainter;

import sun.misc.BASE64Encoder;

public class BarcodeUtil {

	/**
	 * 128条形码
	 * 
	 * @param strBarCode
	 *            条形码:0-100位
	 * @param dimension
	 *            商品条形码:尺寸
	 * @param barheight
	 *            商品条形码:高度
	 * @return 图片(Base64编码)
	 */
	public static String generateBarCode128(String strBarCode, String dimension, String barheight) {

		try {
			ByteArrayOutputStream outputStream = null;
			BufferedImage bi = null;
			JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(),
					EAN13TextPainter.getInstance());

			// 尺寸,面积,大小 密集程度
			productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
			// 高度 10.0 = 1cm 默认1.5cm
			productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
			// 宽度
			productBarcode.setWideRatio(Double.valueOf(30).doubleValue());
			// 是否显示字体
			productBarcode.setShowText(true);
			// 显示字体样式
			productBarcode.setTextPainter(BaseLineTextPainter.getInstance());

			// 生成二维码
			bi = productBarcode.createBarcode(strBarCode);

			outputStream = new ByteArrayOutputStream();
			ImageIO.write(bi, "jpg", outputStream);
			
			BASE64Encoder encoder = new BASE64Encoder();
			return encoder.encode(outputStream.toByteArray());
		} catch (Exception e) {
			e.printStackTrace();
			return "encodeError";
		}
	}
}

替代为java.util.Base64.Encoder后:

package util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WidthCodedPainter;

import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

public class BarcodeUtil {

	/**
	 * 128条形码
	 * 
	 * @param strBarCode
	 *            条形码:0-100位
	 * @param dimension
	 *            商品条形码:尺寸
	 * @param barheight
	 *            商品条形码:高度
	 * @return 图片(Base64编码)
	 */
	public static String generateBarCode128(String strBarCode, String dimension, String barheight) {

		try {
			ByteArrayOutputStream outputStream = null;
			BufferedImage bi = null;
			JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(),
					EAN13TextPainter.getInstance());

			// 尺寸,面积,大小 密集程度
			productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
			// 高度 10.0 = 1cm 默认1.5cm
			productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
			// 宽度
			productBarcode.setWideRatio(Double.valueOf(30).doubleValue());
			// 是否显示字体
			productBarcode.setShowText(true);
			// 显示字体样式
			productBarcode.setTextPainter(BaseLineTextPainter.getInstance());

			// 生成二维码
			bi = productBarcode.createBarcode(strBarCode);

			outputStream = new ByteArrayOutputStream();
			ImageIO.write(bi, "jpg", outputStream);
			
			Encoder encoder = Base64.getEncoder();
			return encoder.encodeToString(outputStream.toByteArray());
		} catch (Exception e) {
			e.printStackTrace();
			return "encodeError";
		}
	}
	
	/**
	 * 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;
	}
}

方法二、 Maven引入commons-codec.jar

<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.3</version>
</dependency>

替代为org.apache.commons.codec.binary.Base64后:

package util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WidthCodedPainter;

import org.apache.commons.codec.binary.*;;

public class BarcodeUtil {

	/**
	 * 128条形码
	 * 
	 * @param strBarCode
	 *            条形码:0-100位
	 * @param dimension
	 *            商品条形码:尺寸
	 * @param barheight
	 *            商品条形码:高度
	 * @return 图片(Base64编码)
	 */
	public static String generateBarCode128(String strBarCode, String dimension, String barheight) {

		try {
			ByteArrayOutputStream outputStream = null;
			BufferedImage bi = null;
			JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(),
					EAN13TextPainter.getInstance());

			// 尺寸,面积,大小 密集程度
			productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
			// 高度 10.0 = 1cm 默认1.5cm
			productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
			// 宽度
			productBarcode.setWideRatio(Double.valueOf(30).doubleValue());
			// 是否显示字体
			productBarcode.setShowText(true);
			// 显示字体样式
			productBarcode.setTextPainter(BaseLineTextPainter.getInstance());

			// 生成二维码
			bi = productBarcode.createBarcode(strBarCode);

			outputStream = new ByteArrayOutputStream();
			ImageIO.write(bi, "jpg", outputStream);

			return Base64.encodeBase64String(outputStream.toByteArray());
		} catch (Exception e) {
			e.printStackTrace();
			return "encodeError";
		}
	}

	/**
	 * Base64.decodeBase64解密
	 * 
	 * @param data 要解密的字符串
	 * @return 解密后的byte[]
	 * @throws Exception
	 */
	public static byte[] decryptBASE64(String data) throws Exception {
		byte[] buffer = Base64.decodeBase64(data);
		return buffer;
	}
}

方法三、 Maven引入rt.jar
这种方法还是使用sun.misc.BASE64Encoder,不过不推荐使用,因为依赖于JAVA_HOME,如果其他的服务器没有JAVA_HOME,则会编译失败,报Fatal Error: Unable to find package java.lang in classpath or bootclasspath

<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<version>2.5</version>
		<configuration>
			<source>${jdk.version}</source>
			<target>${jdk.version}</target>
			<encoding>UTF-8</encoding>
			<compilerArguments>
				<verbose />
				<bootclasspath>${JAVA_HOME}/jre/lib/rt.jar${path.separator}${JAVA_HOME}/jre/lib/jce.jar</bootclasspath>
			</compilerArguments>
		</configuration>
</plugin>
### 回答1: sun.misc.base64encoder是Java SE中的一个类,用于将二进制数据编码为Base64格式。它是Java SE中的一个内部类,因此不建议在应用程序中直接使用它。如果需要使用Base64编码,建议使用Java SE 8中引入的java.util.Base64类。 ### 回答2: 在Java中,sun.misc.base64encoder是一种Base64编码器,用于将二进制数据转换成可读的ASCII字符。然而,需要注意的是,sun.misc.base64encoder是一种不推荐使用的方法,因为它是由SUN提供的Java库,不属于Java标准的一部分。这意味着在某些Java实现中,可能没有这个类可用。此外,由于它不是标准API,它可能在任何时候都被移除或更改。 而且,根据Java官方文档的说明,sun.misc.base64encoder已过时,并且已被替换为java.util.Base64类。因此,对于新的开发项目,推荐使用java.util.Base64。它是Java 8中引入的标准API,可以直接从java.util包中使用。而且,相比sun.misc.base64encoder,java.util.Base64提供了更好的处理二进制数据的能力和更好的性能。使用java.util.Base64还可以避免不受支持的类库依赖的问题。 虽然sun.misc.base64encoder不推荐使用,但在现有的一些项目中,它仍然可能是必须使用的。如果需要使用它,可以通过配置将sun.misc.base64encoder添加到Java类路径。具体可以通过在Java命令行中添加-Djava.ext.dirs=PATH_TO_SUN_MISC_JAR的方式来实现。这个方法需要在部署时慎重考虑,并且需要检查平台兼容性。而且,如果将sun.misc.base64encoder添加到Java类路径中,则需要定期检查Java安全补丁和版本更改,以确保应用程序的稳定性和安全性。 ### 回答3: sun.misc.base64encoder是一个Java类,它提供了Base64编码的实现。Base64编码是一种用于将二进制数据转换为可读字符串的编码方式,它将每三个8位的字节编码成四个可打印字符。该编码方式常用于电子邮件、HTTP等网络应用中,以及其他一些需要将二进制数据转换为文本表示的场合。 然而,sun.misc.base64encoder已经被Java官方标记为过时(Deprecated),并且在较新的Java版本中已经被删除。尽管该类在一些老的Java程序中依然存在,但是它不再被推荐使用。Java官方建议使用java.util.Base64类代替sun.misc.base64encoder,这个类提供了更好的Base64编码解码功能,并且已经在Java 8中被添加到标准API中。 基于以上原因,对于依赖sun.misc.base64encoder的程序来说,必须及时进行代码升级,使用java.util.Base64替代之前的代码。否则,当程序迁移到新的Java版本中时,sun.misc.base64encoder可能已经被删除,程序将无法正常运行。 总的来说,虽然sun.misc.base64encoder曾经是Java中Base64编码的主要实现,但它已经不再推荐使用。开发者们需要使用java.util.Base64类替代之前的代码,以免在迁移后造成不必要的麻烦和风险。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值