在Solaris上无法初始化sun.awt.X11GraphicsEnvironment类

22

当我在Solaris机器上运行我的安装程序时,遇到了这个错误:

Installing...
-------------

 [==================|==================|==================|==================]
 [---Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)

Stack Trace:
java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
        at sun.awt.X11FontManager.isHeadless(X11FontManager.java:487)
        at sun.awt.X11FontManager.getFontPath(X11FontManager.java:767)
        at sun.font.SunFontManager.getPlatformFontPath(SunFontManager.java:3288)
        at sun.font.SunFontManager$11.run(SunFontManager.java:3314)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.loadFonts(SunFontManager.java:3310)
        at sun.awt.X11FontManager.loadFonts(X11FontManager.java:439)
        at sun.font.SunFontManager.findFont2D(SunFontManager.java:2347)
        at sun.font.SunFontManager.findFont2D(SunFontManager.java:2285)
        at java.awt.Font.getFont2D(Font.java:498)
        at java.awt.Font.getFamily(Font.java:1187)
        at java.awt.Font.getFamily_NoClientCode(Font.java:1161)
        at java.awt.Font.getFamily(Font.java:1153)
        at ZeroGrs.a(DashoA10*..)
        at ZeroGrs.a(DashoA10*..)
        at ZeroGrs.a(DashoA10*..)
        at ZeroGrs.a(DashoA10*..)
        at ZeroGrs.a(DashoA10*..)
        at ZeroGrs.a(DashoA10*..)
        at com.zerog.ia.installer.actions.InstallUninstaller.a(DashoA10*..)
        at com.zerog.ia.installer.actions.InstallUninstaller.d(DashoA10*..)
        at com.zerog.ia.installer.actions.InstallUninstaller.installSelf(DashoA10*..)
        at com.zerog.ia.installer.InstallablePiece.install(DashoA10*..)
        at com.zerog.ia.installer.actions.InstallDirectory.install(DashoA10*..)
        at com.zerog.ia.installer.actions.InstallDirectory.install(DashoA10*..)
        at com.zerog.ia.installer.InstallablePiece.install(DashoA10*..)
        at com.zerog.ia.installer.GhostDirectory.install(DashoA10*..)
        at com.zerog.ia.installer.InstallablePiece.install(DashoA10*..)
        at com.zerog.ia.installer.Installer.install(DashoA10*..)
        at com.zerog.ia.installer.LifeCycleManager.b(DashoA10*..)
        at com.zerog.ia.installer.LifeCycleManager.a(DashoA10*..)
        at com.zerog.ia.installer.Main.main(DashoA10*..)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at com.zerog.lax.LAX.launch(DashoA10*..)
        at com.zerog.lax.LAX.main(DashoA10*..)

我尝试使用JAVA_OPTS配置-Djava.awt.headless=true,但它不起作用!

还有其他解决方案吗?

8个回答

22

问题已解决。是我的个人配置文件设置了DISPLAY参数,但该参数指向的主机无法连接。 我已经正确设置了DISPLAY参数,问题得到了解决。

$ export DISPLAY=

或者

$ unset DISPLAY


导出DISPLAY是什么意思?我不太懂。当我执行“echo $ DISPLAY”时,它会显示“localhost:11.0”。这是什么意思? - Mohammad Faisal
1
这个评论不仅仅是答案,还帮助了很多人。 - Mohammad Faisal
也曾为Debian工作。谢谢。 - corporateWhore

20

尝试在servlet的构造函数中运行此代码。

System.setProperty("java.awt.headless", "true"); 

或者

在服务器的启动脚本中使用此参数:

-Djava.awt.headless=true

这是一个问题的例子,在Apache POI文档中有详细的解释,当你想要创建一个自动调整列宽的工作表时会发生。

2
太好了。解决了我突然遇到的生产问题。我尝试将“System.setProperty(“java.awt.headless”,“true”);”放在Wicket框架使用的单例应用程序类中,但没有起作用。所以我们将其添加到setenv.sh中,这样就解决了问题。 - eaglei22

17

实际上,

-Djava.awt.headless=true

不能修复问题,它只是绕过了它。问题在于你尝试运行的应用程序想要在XWindows中运行UI。这个错误相当于Java版本的“dll未找到”或“.so未找到”。实际执行此操作所需的库不在你使用的JVM类路径中。

问题在于你正在使用OpenJDK(或类似Jikes的其他Java版本),而awt是Java的部分之一,由于许可证原因无法开源。因此,这个类是有意不存在于OpenJDK中,也永远不会存在于其中。

通过声明

-Djava.awt.headless=true

你正在以命令行模式运行它,而不是所有应用程序都可以这样做。在你的情况下,你摆脱了这个问题。要真正解决此问题的唯一方法是将该类及其所有依赖类添加到你的类路径中。最简单的方法是切换到sun JRE。


根据此链接,如果本地GUI库不存在且JDK正在尝试使用它,则可能会发生这种情况。 - Kalpesh Soni
3
我是一名有15年经验的Java开发人员。你提到的链接基本上说JVM正在尝试实现自己的渲染,而不是使用本地库。这也是不正确的(很久以前曾经是)。这个错误指向了SUN MICROSYSTEMS特定的实现,清楚地表明你在Java中遇到了“.dll/so未找到”的问题,这是无法否认的。我假设在合适的条件下可能会出现底层本地库的故障并产生这个错误,但这种情况非常少见。对于这种情况,Java有一个特殊的错误:UnsatisfiedLinkError,这并不是这里发生的事情。 - Christian Bongiorno
JVM 正试图使用 X11 的本地库,但找不到或无法实例化它 - 具体的错误处理方式显然取决于 Sun 编写代码的方式。 - Kalpesh Soni

1
可能的原因是您使用的显示变量未正确设置。 运行
echo $DISPLAY

请确保输出正确。 如果是桌面电脑,通常情况下显示的是0;如果是远程连接,则通常显示主机名或IP和数字,例如1.2.3.4:0。
根据代码中检查和使用DISPLAY的方式,您可以取消设置它,这样像Google Cloud Directory Sync这样的工具就可以继续运行而不会尝试启动图形安装程序。
如果这对您没有用,因为您需要设置适当的显示变量和权限(请检查xhost命令),例如可以启动Xterm来查看是否可以正常工作。
在我的情况下,我正在docker中运行安装程序,并且必须将其设置为桌面IP,其中我的docker主机网络被绑定到该IP。
export DISPLAY=10.11.211.211:0

之后它对我有效。


1
我在我的Linux服务器上也遇到了同样的问题。不知道发生了什么神奇的事情,但通过在我的Linux系统上安装Xorg,问题完美地解决了。
sudo apt-get install xorg openbox

我在使用 Gnome 的时候遇到了同样的问题,但是出于某种原因,如果我使用 Gnome Xorg 登录,一切都按预期工作。 - marcogmonteiro

1
请确保您没有更改任何主机名,如果是这种情况导致了问题,请检查主机名。

那是我的情况。我更改了主机名,然后在Debian 6上出现了这个问题。在注销后重新登录后,问题得到解决。有什么见解为什么会发生这种情况吗? - dvlcube

1
通常情况下,程序开始激活无头模式,告诉程序,现在你必须在无头模式下工作,不要期望硬件帮助,你必须自力更生,依靠系统的计算能力来模拟这些功能:
System.setProperty("java.awt.headless","true");

请编辑${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 \

直接搜索行 -Djava.io.tmpdir="$CATALINA_TMPDIR" 并将其添加到此行下面:

-Djava.awt.headless=true \

总共有七个地方,可以在重新启动后解决。


0
如果出现此错误的“安装程序”实际上是基于install4j的,请注意简单的解决方案是使用-c标志,因此:
./myinstaller.sh

成为:

./myinstaller.sh -c

我遇到了与最初在此处提到的相同的错误,但是在Linux上而不是Solaris上。虽然网上有很多建议,比如这里和更多,但我很幸运,在我的情况下,只需添加那个-c就可以了。

更多信息请参见:https://www.ej-technologies.com/resources/install4j/help/doc/installers/installerModes.html#console


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接