no jpeg in java.library.path;java.lang.NoClassDefFoundError: Could not initialize class sun.awt.imag...

本文针对Java环境下使用JPEGImageEncoder类进行图片压缩时遇到的问题提供了解决方案。由于该类在Java 1.7及以后版本中被废弃,在CentOS环境下会引发错误。文章通过引入ImageIO类替代JPEGImageEncoder,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

no jpeg in java.library.path;java.lang.NoClassDefFoundError: Could not initialize class sun.awt.image.codec.JPEGImageEncoderImpl

因为要压缩图片,所以用到了JPEGImageEncoder类,但这个类在1.7后就被抛弃了,导致现在调用总是报错,虽然我在本地windows eclipse上可以成功调用,但到了centos上就出错了。

从网上的建议看,就是取而代之用ImageIO类就能解决这个问题。

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;

public class ImageUtil {
    
    // 压缩图片到制定的宽度,同时长度压缩到相同比例
    private static final int COMPRESS_WIDTH = 150;
    
    // 压缩质量
    private static final float RATIO = 0.99f;
    /**  
     * 按宽度高度压缩图片文件<br> 先保存原文件,再压缩、上传  
     * @param oldFile  要进行压缩的文件全路径  
     * @param newFile  新文件  
     * @param width  宽度  
     * @param height 高度  
     * @param quality 质量  
     * @return 返回压缩后的文件的全路径  
     */    
    public static boolean compressImage(
            String oldPath, String newPath) {    
        File oldFile = new File(oldPath);
        File newFile = new File(newPath);
        
        if (!oldFile.exists()) {    
            return false;
        }
        
        String newImage = null;    
        try {    
            /** 对服务器上的临时文件进行处理 */    
            Image srcFile = ImageIO.read(oldFile);    
            int w = srcFile.getWidth(null);    
        //  System.out.println(w);    
            int h = srcFile.getHeight(null);    
        //  System.out.println(h);    
    
            /** 宽,高设定 */ 
            // 压缩后的高
            int height = (int)(1.0*COMPRESS_WIDTH/w*h);
            BufferedImage tag = new BufferedImage(
                    COMPRESS_WIDTH, height
                    ,BufferedImage.TYPE_INT_RGB);
            
            tag.getGraphics().drawImage(srcFile, 0, 0, COMPRESS_WIDTH, height, null);    
            //String filePrex = oldFile.substring(0, oldFile.indexOf('.'));    
            /** 压缩后的文件名 */    
            //newImage = filePrex + smallIcon+ oldFile.substring(filePrex.length());    
    
            /** 压缩之后临时存放位置 */    
            
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);    
            /** 压缩质量 */    
            jep.setQuality(RATIO, true);    
            

//            FileOutputStream out = new FileOutputStream(newFile);    
//            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);    
//            encoder.encode(tag, jep);    
            
            String formatName = newPath.substring(newPath.lastIndexOf(".") + 1);
            //FileOutputStream out = new FileOutputStream(dstName);
            //JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            //encoder.encode(dstImage);
            ImageIO.write(tag, /*"GIF"*/ formatName /* format desired */ , new File(newPath) /* target */ );
//            out.close();    
        } catch (FileNotFoundException e) {    
            e.printStackTrace();    
        } catch (IOException e) {    
            e.printStackTrace();    
        }    
        return true;    
    }    
}

转载于:https://www.cnblogs.com/sevenun/p/7441858.html

<think>好的,我现在需要解决用户提到的Java运行时出现的NoClassDefFoundError错误,具体涉及sun.awt.X11.XToolkit类的问题。首先,我得回忆一下这个错误的常见原因。用户提供的引用内容提到这可能与图形化问题有关,特别是在无头环境中运行需要图形界面的操作时。比如,服务器环境下没有图形显示设备,但应用尝试初始化图形工具包就会出错。 接下来,我需要确认解决方案。根据引用中的信息,解决方法是在Tomcat的启动脚本中添加-Djava.awt.headless=true参数。这个参数告诉Java使用headless模式,允许在没有物理显示设备的情况下执行图形操作。用户提供了具体的配置位置,即修改Tomcat的catalina.sh文件,将JAVA_OPTS加上该参数。比如,引用3和4都提到了这一点,说明这是主要的解决方法。 然后,我需要考虑是否有其他可能的解决途径。例如,是否有依赖项缺失或环境配置问题,但根据错误信息,主要问题还是headless模式的设置。此外,用户可能是在非图形环境下运行应用,比如Linux服务器,这时候默认没有X11环境,导致XToolkit无法初始化。所以,设置headless模式是最直接的解决方案。 另外,用户可能还关心如何验证这个修改是否生效,或者是否有其他需要注意的地方。比如,检查Tomcat启动时是否正确加载了这个参数,或者是否有其他配置冲突。同时,还要提醒用户修改后重启Tomcat服务使配置生效。 最后,总结解决步骤:定位到catalina.sh文件,添加JAVA_OPTS参数,保存并重启Tomcat。同时,解释为什么这个参数有效,帮助用户理解根本原因,避免未来类似问题。</think>针对Java运行时出现的$java.lang.NoClassDefFoundError:\ Could\ not\ initialize\ class\ sun.awt.X11.XToolkit$错误,以下是逐步解决方案及原理分析: ### 问题原因 该异常通常出现在无图形界面(Headless)环境中尝试初始化图形工具包时。例如: 1. 服务器未安装X11图形环境[^2] 2. Java应用在无显示器设备的环境下调用AWT/Swing图形组件[^5] 3. Tomcat等Web容器默认不启用headless模式[^3] ### 解决方案 #### 方法一:启用Headless模式(推荐) 1. 打开Tomcat配置文件: ```bash vim $TOMCAT_HOME/bin/catalina.sh ``` 2. 在`JAVA_OPTS`配置段添加参数: ```bash JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true" ``` 3. 重启Tomcat服务: ```bash $TOMCAT_HOME/bin/shutdown.sh && $TOMCAT_HOME/bin/startup.sh ``` 此配置强制Java使用Headless模式处理图形操作[^4][^5] #### 方法二:安装Xvfb虚拟显示(Linux环境) ```bash sudo apt-get install xvfb Xvfb :1 -screen 0 1024x768x24 & export DISPLAY=:1 ``` 适合需要实际图形渲染但无物理显示器的场景 #### 方法三:检查依赖完整性 验证JRE安装是否完整: ```bash java -version jar tf $JAVA_HOME/lib/rt.jar | grep XToolkit.class ``` 若缺失核心类文件,需重新安装JDK/JRE ### 原理示意图 $$ \begin{array}{ccc} \text{应用程序} & \rightarrow & \text{AWT组件调用} \\ \downarrow & & \downarrow \\ \text{无显示器环境} & \xrightarrow{\text{-Djava.awt.headless=true}} & \text{虚拟图形设备} \\ \end{array} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值