`
thecloud
  • 浏览: 881624 次
文章分类
社区版块
存档分类
最新评论

“No X11 DISPLAY variable was set”问题的解决过程

 
阅读更多

1.之前在windows上验证,截屏功能很正常,于是部署到linux上

2.运行后,报“No X11 DISPLAY variable was set, but this program performed an operation which requires it. ”的错误。

是HeadlessToolkit.getScreenSize()这个函数

3.百度了下,原因大概知道了。主要是linux的机制问题。 需要先确认是否接了显示器,有没有图形界面输出。然后正确指定输出位置才行。

于是按照这个思路:

(1)在java程序启动时候,增加了-DJava.awt.headless=true参数

(2)在linux的启动文件/etc/profile中增加了 export DISPLAY=localhost:0

结果,又报了另一个错:Exception in thread "main" java.awt.HeadlessException
4. 考虑了一下,我们的程序运行的linux上是有图形界面的输出的所以DJava.awt.headless=true 可能不合适,

所以修改为-DJava.awt.headless=false ,然后重新启动了java程序。发现截屏可以输出了。

5. 非常高兴,然后重启机器,再执行截屏,发现又失败了。而且日志中什么都没有输出。怎么回事呢

6 比较 一下 成功情况和失败情况的区别。 一个是起了命令行后启动程序,一个是开机后后台自启动。就是这个差别。

前者截屏正常。 可能还是没有获取到正确的图形界面接口。但是明明已经在环境变量里设置了啊。

有什么区别呢

7. 尝试了一下,把环境变量的设置调整到java程序启动前执行。(sh文件中),然后测试,居然重启后截屏成功了。

什么原因呢。 改变的写法,能够保证 DISPLAY=localhost:0在java程序执行前执行。 但是之前的写法的话。是系统登录后,进行环境变量的

加载的,这个过程和java程序自启动的过程是异步的。所以很有可能java程序启动后,环境变量还没有赋值。从而导致找不到GUI接口。

这个是我个人的分析。

峰回路转,总算解决了问题。 也获得了经验

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics