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

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

今天在linux下使用opencv,想把图片展示出来,结果调用窗口时出现了这个错误,我根据下面这篇帖子的解决方法发现我的jre中是不缺文件的,只需要在程序加载时设置一下 System.setProperty("java.awt.headless", "false"); ,我是将这句放在一个static函数中就解决了。

在这里插入图片描述

一、问题描述

一时兴起,想写一个手机远程控制电脑的软件程序,于是用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包,不知道使用官方的软件包是否有问题。

作者:QJZ365
来源:CSDN
原文:https://blog.csdn.net/qq_32451699/article/details/52344581

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值