原创

Linux 报 java.awt.HeadlessException 错误解决方案

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。本人在调用微博登录接口时,报 java.awt.HeadlessException 错误,总结了一下解决方案。

部署到 Tomcat 服务器时报 java.awt.HeadlessException 错误,具体日志如下:

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:207)
at java.awt.Window.<init>(Window.java:535)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.SwingUtilities$SharedOwnerFrame.<init>(SwingUtilities.java:1757)
at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1832)
at javax.swing.JOptionPane.getRootFrame(JOptionPane.java:1697)
at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:863)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:667)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:638)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:609)
at weibo4j.util.BareBonesBrowserLaunch.openURL(BareBonesBrowserLaunch.java:29)
at com.yoodb.platform.front.controller.FLoginController.wbLogin(FLoginController.java:275)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

网上搜索后,原因是没有配置Headless Mode,Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。修改配置 ${TOMCAT_HOME}/bin/catalina.sh 或 ${TOMCAT_HOME}/bin/catalina.bat 文件步骤如下:

在所有类似一下代码出修改:

      exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start

修改内容之后为:

      exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-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=false \
org.apache.catalina.startup.Bootstrap "$@" start

只是在倒数第二行增加了 “ -Djava.awt.headless=false \ ” 参数,以tomcat 7 为例共修改了 7 处地方,注意如果 “ -Djava.awt.headless=false \ ” 参数为“ -Djava.awt.headless=true \ ” 时则会报如下错误:

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
at java.awt.Window.<init>(Window.java:535)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.SwingUtilities$SharedOwnerFrame.<init>(SwingUtilities.java:1757)
at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1832)
at javax.swing.JOptionPane.getRootFrame(JOptionPane.java:1697)
at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:863)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:667)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:638)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:609)
at weibo4j.util.BareBonesBrowserLaunch.openURL(BareBonesBrowserLaunch.java:29)
at com.yoodb.platform.front.controller.FLoginController.wbLogin(FLoginController.java:275)

启动tomcat之后报 server using ':0.0' as the value of the DISPLAY variable. 错误,具体日志如下:

server using ':0.0' as the value of the DISPLAY variable.] with root cause
java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:120)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at java.awt.Toolkit$2.run(Toolkit.java:869)
at java.security.AccessController.doPrivileged(Native Method)

解决方式使用 linux 命令,vim /etc/profile 编辑文件,在文件中增加 export DISPLAY=localhost:0.0 (jdk已配置)参数具体如下: 

[root@iZ256w2hluuZ ~]# vim /etc/profile
export DISPLAY=localhost:0.0
JAVA_HOME=/usr/java/jdk1.7.0_71
JRE_HOME=/usr/java/jdk1.7.0_71/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

执行 linux 命令,是环境变量立即生效,具体如下:

[root@iZ256w2hluuZ ~]# source /etc/profile
~阅读全文-人机检测~

微信公众号“Java精选”(w_z90110),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

  1. #1

    木昜 (2019/01/23 10:07:44)回复
    博主,您好,我遇到了与您相同的问题, 根据指示流程进行之后:与第二步报错相同。 server using ':0.0' as the value of the DISPLAY variable 变为了 server using 'localhost:0.0' as the value of the DISPLAY variable。 我的程序是在使用aspose依赖包内出现的该异常。

    路人甲 (2019/01/23 14:14:04)回复
    参考的我步骤,就能解决问题,我就是这样一步一步解决的。注意localhost问题。

分享:

支付宝

微信