1. ホーム
  2. tomcat

tomcat8 で X11GraphicsEnvironment の問題が発生し、クラス sun.awt.X11GraphicsEnvironment を初期化できない。

2022-02-28 07:15:15

サイトのcaptchaが突然表示されなくなり、以下のエラーが報告されます。以前にもこのエラーが出たことがありますが、キャプチャではないので、いずれにせよ同じ問題です。

原因:java.lang.NoClassDefFoundError: クラス sun.awt.X11GraphicsEnvironment を初期化できませんでした。


ネットで検索した結果、catalina.shに "-Djava.awt.headless=true \ を追加することで解決しました。
調べてみると、Xserverが起動されていない、アクセス権限がないなど、tomcatを起動したユーザがXserverにアクセスできない場合が多いようです。

について、ネット上で議論されています。 ヘッドレスモード の説明

<スパン 1. ヘッドレスモードとは何ですか? 
ヘッドレスモードとは、システムのコンフィグレーションモードの一つです。このモードでは、システムには表示デバイス、キーボード、マウスがありません。

<スパン 2. ヘッドレスモードを使用するタイミングは?
ヘッドレスモードはあまり望むところではありませんが、特にサーバーサイドのプログラム開発者にとっては、このモードで作業する必要があることが多いのが実情です。これは、サーバー(Webサービスを提供するホストなど)には前述のようなデバイスがない場合が多いのですが、クライアント(ブラウザが存在する関連ディスプレイデバイス、キーボード、マウスを持つホストなど)に提供する適切なデータを生成するために、それらの機能を利用する必要があるためです。

<スパン 3. ヘッドレスモードの使い方を教えてください。
一般的なルールとしては、プログラムの最初にヘッドレスモードを有効にして、これからヘッドレスモードで作業するので、ハードウェアの助けを期待せず、システムの計算能力に頼ってこれらの機能をエミュレートしてくださいと伝えます。
System.setProperty("java.awt.headless","true") を設定します。

TOMCAT_HOME}/bin/catalina.sh または ${TOMCAT_HOME}/bin/catalina.bat ファイルを以下のように修正します。

以下のようなすべてのコードで。
    JAVA_OPTS $CATALINA_OPTS \ \
      -Djava.ENDORSED.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ \?
      -Djava.security.manager
      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \?
      -Dcatalina.base="$CATALINA_BASE" \.
      -Dcatalina.home="$CATALINA_HOME" ୧⃛(๑⃙⃘◡̈๑⃙⃘)
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \.

文末に追加してください。
-Djava.awt.headless=true \?

以下のように修正しました。
    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \.
      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \.
      -Dcatalina.base="$CATALINA_BASE" \.
      -Dcatalina.home="$CATALINA_HOME" ୧⃛(๑⃙⃘◡̈๑⃙⃘)
      -Djava.io.tmpdir="$CATALINA_TMPDIR" \.
-Djava.awt.headless=true \?

直接検索して、-Djava.io.tmpdir="$CATALINA_TMPDIR"という行を探して、この行の下に追加してください。 
-Djava.awt.headless=true \? 

全部で7つあり、変更後に再起動すると直ります。