“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接口。

 

這個是我個人的分析。

峰回路轉,總算解決了問題。 也獲得了經驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM