概述
前几天,遇见一个很头疼的问题,我解决了一下午现在和大家分享一下,再写一段图片压缩的代码使用了com.sun.image.codec.jpeg这个类,本地跑项目没有问题,但是jenkins构建的时候提示的程序包com.sun.image.codec.jpeg不存在,去各种百度才发现编译失败原因是:
JDK7的时候,com.sun.image.codec.jpeg类已经退休了,以后凡是带sun.*的类库将不会被支持。javac在编译代码时,当他尝试从rt.jar中找寻对应的类文件时,他会默认从对应的符号表文件ct.sym
(同样在jre/lib/下)中查找该类是否存在,由于ct.sym中有意或无意的遗失了部分rt.jar中的类,包括com.sun.image.codec.jpeg,因此导致编译报错。
解析失败原因我参考的:https://blog.csdn.net/eleanoryss/article/details/80015293,但是使用了之后确实编译通过的,因为我看他的解决办法就是不编译这个包所以可以通过,但是到了服务器上测试的时候,发现直接报错找不到这个类。
解决方法:既然这个包不可以用编译不通过,那就只好换一种写法来尝试一下了,下面我把更换的方法代码贴在下面:
FileOutputStream out = new FileOutputStream(imgdist);
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
// encoder.encode(tag);
// out.close();
float per = (float) 0.85;
saveAsJPEG(100, tag, per, out);
这里注释掉的是我之前使用的com.sun.image.codec.jpeg这个包下面的方法才导致编译不通过的,现在换一种思路使用ImageIO下面的包来解决:
/**
* 以JPEG编码保存图片
*
* @param dpi 分辨率
* @param image_to_save 要处理的图像图片
* @param JPEGcompression 压缩比
* @param fos 文件输出流
* @throws IOException
*/
public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {
// Image writer
ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
imageWriter.setOutput(ios);
//and metadata
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);
if (dpi != null && !dpi.equals("")) {
//new metadata
Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
jfif.setAttribute("Xdensity", Integer.toString(dpi));
jfif.setAttribute("Ydensity", Integer.toString(dpi));
}
if (JPEGcompression >= 0 && JPEGcompression <= 1f) {
// new Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(JPEGcompression);
}
//new Write and clean up
imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
ios.close();
imageWriter.dispose();
}
这样就完美的解决了,亲测有效,如果想要整个工具类的朋友可以去我的另一篇播客查看https://blog.csdn.net/weixin_43549912/article/details/103269117
最后
以上就是沉默小猫咪为你收集整理的maven编译提示:程序包com.sun.image.codec.jpeg不存在,替换为ImageIO解决办法的全部内容,希望文章能够帮你解决maven编译提示:程序包com.sun.image.codec.jpeg不存在,替换为ImageIO解决办法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复