linux 下调用Java AWT抛出java.awt.HeadlessException异常解决办法

时间:2022-02-22 11:12:37



一、问题描述

         一时兴起,想写一个手机远程控制电脑的软件程序,于是用Java写了一个服务器端的程序,用android写了客服端的程序,刚开始把服务器端在windows下运行,一切正常。但当把java服务器端的程序运行在linux下,问题出现了,由于我的服务器端的程序需要截取电脑屏幕,要使用awt,但运行程序会抛出:

           Exception in thread "main" java.awt.HeadlessException

           at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
           at java.awt.Window.<init>(Window.java:536)
           at java.awt.Frame.<init>(Frame.java:420)

           at Test.main(Test.java:6)

这个异常, 于是上网搜索什么是headless异常,终于在orancle的官网(http://www.oracle.com/technetwork/articles/javase/headless-136834.html)上找到了答案。

       了解了无头模式之后,我以为我找到了问题的根源,我的linux用的是fedroa发行版,是有图形界面、显示屏、鼠标的,我是不需要使用Headless模式的,于是迫不及待的在程序的运行的首行添加System.setProperty("java.awt.headless", "false");运行程序发现依然抛出上面的那个异常。

      这我就郁闷了,按道理说应该没问题了呀!我很不甘心,于是又设置成System.setProperty("java. awt.headless", "true");

这次程序又抛出了一个错误,只不过这次的错误有点不同:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1842)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at java.awt.Toolkit$3.run(Toolkit.java:1640)
    at java.awt.Toolkit$3.run(Toolkit.java:1638)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Toolkit.loadLibraries(Toolkit.java:1637)
    at java.awt.Toolkit.<clinit>(Toolkit.java:1672)
    at java.awt.Component.<clinit>(Component.java:593)
    at Test.main(Test.java:6) 

上面的错误表明/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/这个路径下的ibawt_headless.so文件有问题,于是我cd 这个目录下却发现根本没有这个文件。然后我就在openjdk的解压缩文件夹的jre/lib/amd64/找到了这个文件,我把它复制到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/路径下。再次运行程序,发现成功了,我的窗口、面板、控件一下子都出现在眼前。然后我以为问题解决了,就没再深入研究。

          第二天,我又在linux下用Java写了一个awt程序,这次由于粗心没有在程序运行首行设置System.setProperty("java. awt.headless", "true");但我运行程序发现依然可以调出窗口,控件。然后我加上这句代码,依然运行成功,然后我有把模式设置成System.setProperty("java. awt.headless", "false"); 依然运行成功。然后我把/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/路径下的ibawt_headless.so文件删除,再次运行程序发现不设置setProperty或则System.setProperty("java. awt.headless", "false")时,程序运行正常。当System.setProperty("java. awt.headless", "ture")时,程序会抛出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so错误。

二、问题解决

           我们来总结一下上面的问题,我们先约定"不设置"代表程序运行时没有System.setProperty,“false代表程序运行时System. setProperty("java.awt.headless", "false"),“true”代表程序运行时System.setProperty("java. awt.headless", "true");

                首次调用openjdk的awt时:

                        不设置:抛出 java.awt.HeadlessException

                        false:抛出 java.awt.HeadlessException

       true:抛出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-  1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so错误

                     复制libawt_headless.so文件到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/下:

                               不设置:运行正常

                                false:运行正常

                                true: 运行正常

                     删除libawt_headless.so文件运行:

                                 不设置:运行正常

                                 false:运行正常

           true:抛出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so错误

       然后我把libawt_headless.so复制到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/下,现在我无论我是如何运行awt程序,都是正常的。但对于为什么我第一次调用openjdk的awt时一直抛出java.awt.HeadlessException这个异常我还没弄清楚,我想了好久我软件安装应该是没有问题的,应该是我安装的openjdk开源的版本有问题,当时是在开源社区下的rpm包,不知道使用官方的软件包是否有问题。