1. ホーム
  2. Java

X11 DISPLAY変数が設定されていない」問題の解決方法

2022-02-12 12:18:55

1. スクリーンショット機能がwindowsで動作していることを確認したので、linuxにデプロイしてみました

2. 実行後、エラー "No X11 DISPLAY variable was set, but this program performed an operation that requires it.

それは、HeadlessToolkit.getScreenSize()関数です。

3. Baidu、理由はおそらくわかっているはずです。一番の問題は、linuxの仕組みです。モニターが接続されているか、GUI出力があるか、確認する必要がありますね。それから、正しい出力先を指定する必要があります。

では、この線に沿って。

(1) javaプログラムの起動時に -DJava.awt.headless=true パラメータ

(2) Linuxの起動ファイル/etc/profileに追加する。 エクスポート DISPLAY=ローカルホスト:0

その結果、別のエラーが報告されました。スレッド "main" java.awt.HeadlessException で例外が発生しました。
4. 私たちのプログラムは、GUI出力でLinux上で実行されていることを考慮すると、次のようになります。 DJava.awt.headless=trueを指定します。 は適切でない可能性があります。

に変更します。 -DJava.awt.headless=false で、Java プログラムを再起動しました。スクリーンショットが出力可能であることを確認しました。

<スパン 5.非常に満足して、マシンを再起動し、再度スクリーンショットを実行すると、また失敗していることがわかりました。しかも、ログには何も出力されていません。何が起こったのでしょうか?

6 成功例と失敗例の違いを比較する。一つはコマンドライン起動後にプログラムを開始し、一つはブート後にバックグラウンドで勝手に起動する。その違いです。

前者のスクリーンショットは問題なく動作します。もしかしたら、まだ正しいGUIインターフェイスを取得していないのかもしれません。でも、環境変数で明確に設定されています。

<スパン 何が違うの?

7.環境変数の設定を、javaプログラムが起動する前に実行するように調整してみた。(shファイル内)を調整してテストしたところ、再起動後に実際にスクリーンショットが動きました。

その理由は何か。変更された書き込みで、確実に DISPLAY=ローカルホスト:0 が実行されてから、javaプログラムが実行されます。しかし、以前の書き方では するのはシステムログインで、環境変数

この処理は、javaプログラム自体を起動する処理とは非同期である。そのため、javaプログラム起動後に環境変数が代入されていない可能性が高いです。その結果、GUIインターフェイスが見つからないということになります。

こちらは私個人の分析です。

山あり谷ありだったのが、ようやく解決しました。経験値も獲得