Linux下java.awt.HeadlessException的解决

分类: 技术备忘 |
最近做的一个Java Web项目采用Struts2+Spring+HibernateJPA的标准架构,开发环境是win7,服务器部署环境是Ubuntu12.04,项目中有一个模块是采用JFreeChart生成图片,再创建并导入pdf文件中,开发完成后在windows下的tomcat6.0跑没有任何问题,但是部署到Ubuntu服务器上的tomcat6.0之后就不断出现问题。
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an
operation which requires it.
上网查了一下,都说是没有配置Headless Mode。Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主机)。
因此修改${TOMCAT_HOME}/bin/catalina.sh或${TOMCAT_HOME}/bin/catalina.bat文件:
在所有类似以下代码:
在尾部加上一句:
修改后内容如下:
以tomcat6.0为例,总共有七处这样的地方。然后重启tomcat服务器,创建含图表的pdf时仍然报错,但是报的错不太一样了:
java.awt.HeadlessException
于是又上网去查,说是启动tomcat的用户无法访问Xserver,包括Xserver没有启动或者没有权限访问。那就启动一下Xserver呗,于是在终端键入命令startx后报错:
root@localhost:~#startx &
/etc/X11/xinit/xserverrc: line 3:
/usr/bin/X: No such file or directory
/etc/X11/xinit/xserverrc: line 3: exec: /usr/bin/X: cannot execute:
No such file or directory
xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: server error
我觉得可能是有一些依赖包没有安装,所以查找了一下,果然apt-get install xserver-xorg之后,X server可以正常启动了。然后我又照着网上所述配置了DISPLAY环境变量:
root@localhost:~#export DISPLAY=localhost:0.0
root@localhost:~#xhost +
然后重启tomcat服务器,再试还是不行,报错仍然如下:
java.awt.HeadlessException
上网继续找原因,终于在Debian论坛上看到一条回复:
http://s9/mw690/6826662bgd4a29974a4b8&690
于是又在catalina.sh脚本中把headless模式改为了false,重启tomcat服务器,终于没问题了,囧死……至此搞得一头雾水,不过问题总算是没有了。