1

アプリのサーブレットで次のコードを使用しています

java.awt.Image awtImg = java.awt.Toolkit.getDefaultToolkit().createImage(str1);

アプリケーションを実行してサーブレットを呼び出すと、次のエラーが発生します

java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:169)
java.awt.Toolkit$2.run(Toolkit.java:834)
java.security.AccessController.doPrivileged(Native Method)
java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
noticeandreports.pdf.appendFiles.PdfFunctionsClass.addSealSpace(PdfFunctionsClass.java:198)
OJ.NoticesandReports.generate_151_OJNotice.execute(generate_151_OJNotice.java:768)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

JavaバージョンJDK1.6.20を搭載したLinuxマシンでアプリをホストしました。

問題の原因は何ですか...

noticeandreports.pdf.appendFiles.PdfFunctionsClassはコードが記述されているクラスでありOJ.NoticesandReports.generate_151_OJNotice、上記のクラス内のメソッドを呼び出すサーブレットです。

4

2 に答える 2

4

サーバーサイドアプリケーションでAWTクラスを使用するには、「ヘッドレス」モードで実行する必要があると思います。サーブレットコンテナのスタートアップを変更して、次のものを含めます。

-Djava.awt.headless=true

(または、本当に必要な場合は、独自のコード内でシステムプロパティを設定します。)

また、サードパーティ製またはjavax.imageioパッケージの代替イメージングライブラリの使用を検討することもできます。

于 2011-04-07T06:43:59.100 に答える
1

これは、ほぼ確実に完全なスタックトレースではありません。そのスタックトレースまたはログファイル内の以前のスタックトレースのいずれかにより、の初期化がsun.awt.X11.XToolkit失敗した原因がわかります。

ただし、根本的な原因は、Webカウンタを実行しているJVMが「ヘッドレス」であることにあると推測するのは危険です。つまり、アクセシブルなディスプレイがありません。

「JavaSEプラットフォームでのヘッドレスモードの使用」というタイトルのOracleJavaテクニカル記事(ArtemAnanievおよびAllaRedko、2006年6月)では、この問題とその対処方法について説明しています。

-Djava.awt.headless=true解決策はおそらく、Webコンテナの起動スクリプトでJVMオプションに追加するのと同じくらい簡単です。たとえば、Tomcatを使用している場合は、を$JAVA_OPTS呼び出す前にそれを環境変数に追加しますcatalina.sh

于 2011-04-07T06:44:31.147 に答える