linux java no x11_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.(Window.java:535)

at java.awt.Frame.(Frame.java:420)

at java.awt.Frame.(Frame.java:385)

at javax.swing.SwingUtilities$SharedOwnerFrame.(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.(Window.java:535)

at java.awt.Frame.(Frame.java:420)

at java.awt.Frame.(Frame.java:385)

at javax.swing.SwingUtilities$SharedOwnerFrame.(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.(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.(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


版权声明:本文为weixin_29614359原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。