Could not initialize class java.awt.Font错误解决

最近在开发的过程中,需要将一批日志信息生成Excel导出,本地测试通过,但在部署到服务器上时,createSheet方法报错,错误信息是Could not initialize class java.awt.Font。

原因是对于一个Java服务器来说经常要处理一些图形元素,例如地图的创建或者图形和图表等。这些API基本上总是需要运行一个X-server以便能使用AWT(Abstract Window Toolkit,抽象窗口工具集)。

为此在网上查阅了很多博客,众说纷纭,尝试了一些无效方法后,终于找到了一个有效方法,为了以后使用方便,特别将此记录下来。

找到服务器tomcat所在目录。

进入到bin目录下。

编辑catalina.sh

vim catalina.sh

在开头插入如下语句

 

JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"

重启即可。

参考博客:https://blog.csdn.net/catoop/article/details/49057291

### 错误分析 `Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.Font` 表明 JVM 尝试加载 `java.awt.Font` 类时失败,通常是因为缺少必要的依赖项或环境配置不当[^1]。 在 Linux 环境下运行 Web 应用程序(如 Tomcat 或 Nginx),如果服务器未安装图形用户界面 (GUI),可能会遇到此类问题。因为 AWT 和 Swing 组件默认情况下需要 X Window System 支持来渲染字体和其他 GUI 元素[^3]。 ### 解决方案 #### 方法一:安装 Headless 模式支持库 为了使应用程序能够在无头模式下正常工作,可以安装额外的支持包: 对于基于 Debian 的系统: ```bash sudo apt-get update && sudo apt-get install -y libxtst6 libxi6 xfonts-base fontconfig ``` 对于基于 RedHat/CentOS 的系统: ```bash yum install -y xorg-x11-fonts-Type1 dejavu-sans-fonts ``` 这将提供基本的字体资源和支持文件给 Java 运行时环境使用。 #### 方法二:设置 JAVA_OPTS 参数启用 headless 模式 修改启动脚本中的 `JAVA_OPTS` 变量以包含 `-Djava.awt.headless=true` 参数,这样可以让 Java 在不依赖于本地窗口系统的环境中执行图像处理操作。 例如,在 Tomcat 中可以通过编辑 `/etc/default/tomcat9` 文件添加如下内容: ```properties JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true" ``` 或者直接在命令行启动应用时指定此参数: ```bash java -Djava.awt.headless=true -jar your-application.jar ``` 这种方法适用于大多数情况下的生产部署场景,并且不需要更改现有代码逻辑。 #### 方法三:调整 Spring Boot 配置排除不必要的组件扫描 有时即使启用了 headless 模式仍然会触发同样的异常,则可能是由于某些第三方库尝试创建了显式的 AWT/Swing 对象所引起的。此时可以在 spring boot application.properties 或者 yml 文件里加入以下配置防止自动装配这些可能导致冲突的服务: ```yaml spring.autoconfigure.exclude=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration ``` 注意这里列出的具体路径取决于实际项目结构以及哪些模块可能引入了潜在风险。 通过上述措施之一应该能够有效缓解并最终消除该错误的发生频率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值