大家好,欢迎来到IT知识分享网。
问题描述
今天开发同事发了一个错误截图,说是数据导出有问题,提示无法访问指定的页面,如下图:
apama tomcat日志打印的错误内容:
提示没有找到java.awt.Font类, 抛出了NoClassDefFoundError异常。
问题分析
该功能是一个execl导出功能,同hssf实现的execl导出功能。里面用到了设置单元格字体类,默认加载awt的front类。但是当前服务器是一个控制台服务器,没有对应的显示系统比如操作系统桌面、linux的x-window,导致提供真实显示需要的一些重量级组件都找不到实现类。 从而系统运行后报错。 java开发的时候考虑这种情况了, 所以提供了一种对应的无桌面系统下的运行模式,即Headless模式。 该模式提供一些轻量级组件的实现方式,主要通过模拟window实现方式实现了脱离window的工作环境。
Headline模式提供以下实现:
- 创建除顶层以外的轻量级组件,例如Canvas,Panel和Swing组件
- 获取有关可用字体,字体指标和字体设置的信息
- 设置颜色以呈现文本和图形
- 创建和获取图像并准备要渲染的图像
- 使用,和类进行打印。java.awt.PrintJobjava.awt.print。* javax.print。*
- 发出音频提示音
模式切换
怎么从正常模式切换到headline模式呢, 其实很简单,java提供了几种方式:
1、在main函数入口通过System.setProperties(“java.awt.headless”, true);
2、通过java的启动参数指定 JAVA_OPTS=”-Djava.awt.headless=true”
3、在环境变量中定义该属性,并且赋值为true。 export java.awt.headless=true
使用以上3种方法都可以让jvm在启动的时候,把工作模式修改为headline,这样就不会在创建使用awt资源的时候去加载window交互系统提供的具体实现了。
解决方法
因为我们用的是tomcat,所以只需要在tomcat的启动脚本中增加启动参数即可。
修改tomat/bin/catalina.sh脚本,在JAVA_OPTS后面追加-Djava.awt.headless=true
参考地址:https://www.oracle.com/technical-resources/articles/javase/headless.html
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85449.html