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
木昜 (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
问题。