分类: LINUX
2016-11-11 11:51:04
http://blog.sina.com.cn/s/blog_6826662b01018tbf.html
最近做的一个Java Web项目采用Struts2+Spring+HibernateJPA的标准架构,开发环境是win7,服务器部署环境是Ubuntu12.04,项目中有一个模块是采用JFreeChart生成图片,再创建并导入pdf文件中,开发完成后在windows下的tomcat6.0跑没有任何问题,但是部署到Ubuntu服务器上的tomcat6.0之后就不断出现问题。
最开始部署到Ubuntu服务器上的tomcat时,当要创建含图表的pdf文件时,报出如下异常:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.(Window.java:406)
at java.awt.Frame.(Frame.java:402)
at java.awt.Frame.(Frame.java:367)
at javax.swing.JFrame.(JFrame.java:163)
上网查了一下,都说是没有配置Headless Mode。Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主机)。
因此修改${TOMCAT_HOME}/bin/catalina.sh或${TOMCAT_HOME}/bin/catalina.bat文件:
在所有类似以下代码:
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
在尾部加上一句:
-Djava.awt.headless=true \
修改后内容如下:
exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
-Djava.awt.headless=true \
以tomcat6.0为例,总共有七处这样的地方。然后重启tomcat服务器,创建含图表的pdf时仍然报错,但是报的错不太一样了:
java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.(Window.java:406)
at java.awt.Frame.(Frame.java:402)
at java.awt.Frame.(Frame.java:367)
at javax.swing.JFrame.(JFrame.java:163)
于是又上网去查,说是启动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
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.(Window.java:406)
at java.awt.Frame.(Frame.java:402)
at java.awt.Frame.(Frame.java:367)
at javax.swing.JFrame.(JFrame.java:163)
上网继续找原因,终于在Debian论坛上看到一条回复:
于是又在catalina.sh脚本中把headless模式改为了false,重启tomcat服务器,终于没问题了,囧死……至此搞得一头雾水,不过问题总算是没有了。