5

私はtomcatで実行されているアプリケーションを持っています。その方法の1つは、jpeg画像から簡単なサムネイルを作成することです。これらの機能はオフラインでも正常に機能し、1週間前はTomcatでも正常に機能します。しかし今、私は次のエラーを受け取ります:

java.lang.NoClassDefFoundError
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:164)
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1141)
eval.impl.ImageEval.getThumbnail(ImageEval.java:155)
eval.impl.ImageServlet.doGet(ImageServlet.java:79)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

これに影響を与えるものは何も変更していないと思います(実際には、svnリポジトリに従って関数をまったく変更していません)。したがって、ライブラリの問題である必要があります。しかし、私は何が欠けているのか理解できません。エラーが発生するgetThumbnail関数の実際の行は次のとおりです。

        BufferedImage thumbImage = new BufferedImage(thumbWidth, 
            thumbHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics2D = thumbImage.createGraphics();
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.drawImage(simage, 0, 0, thumbWidth, thumbHeight, null);

[編集]問題の説明を少し更新することにしました。はい、彼はjava.awtまたはそれに関連するクラスからいくつかのクラスを見つけることができないようです。ただし、これらはjvmのサーバーに存在します。Javaヘッドレスモードでは問題は解決しません。別のプロジェクトでは、まったく同じコードですが、このサーバーのaxis2Webサービス内で正常に機能しています。[/編集]

4

7 に答える 7

7

Tomcat の設定を変更したようです。

al{0,1}[iu]n[iu]x ボックスに変更したか、テストした仮想マシンとは異なるセキュリティ制御を持つ仮想マシンにインストールしました。

どうやら、

 GraphicsEnvironment.getLocalGraphicsEnvironment()

プロパティにアクセスしようとしています: java.awt.graphicsenv

null または存在しないクラス名が返される可能性があり、それがロードされて ClassNotFoundException がスローされます。1

解決策は、「java.awt.headless」プロパティを指定しているようです。

これは同様の質問です: java.awt.Color エラー

この検索を試してみてください。あなたと同様の状況が表示されます。

Sun Bugs データベースにも何かがあったことを覚えています。

解決策を見つけたら投稿してください!

1.GraphicsEnvironment.java _

編集

日食じゃない!!

私の元の投稿には、例外をスローしているクラスのソース コードへのリンクがあります。

見逃してしまったようですので、こちらに掲載させていただきます。

       public static synchronized GraphicsEnvironment getLocalGraphicsEnvironment() {
          if (localEnv == null) {
               // Y O U R   E R R O R  O R I G I N A T E S    H E R E !!! 
              String nm = (String) java.security.AccessController.doPrivileged
                  (new sun.security.action.GetPropertyAction
                   ("java.awt.graphicsenv", null));

              try {
  //                      long t0 = System.currentTimeMillis();
                  localEnv =
                      (GraphicsEnvironment) Class.forName(nm).newInstance();
  //              long t1 = System.currentTimeMillis();
  //              System.out.println("GE creation took " + (t1-t0)+ "ms.");
                  if (isHeadless()) {
                      localEnv = new HeadlessGraphicsEnvironment(localEnv);
                  }
              } catch (ClassNotFoundException e) {
                  throw new Error("Could not find class: "+nm);
              } catch (InstantiationException e) {
                  throw new Error("Could not instantiate Graphics Environment: "
                                  + nm);
              } catch (IllegalAccessException e) {
                  throw new Error ("Could not access Graphics Environment: "
                                   + nm);
              }
          }

          return localEnv;
      }

それが実行されます。

そして、あなたが読んでいないように見える元の投稿で、コードがプロパティ「java.awt.graphicsenv」にアクセスしていると言いました

axis を使用する他のプロジェクトに同じ問題がない場合は、別の tomcat 構成で実行されているか、axis ライブラリがそのプロパティへのアクセスを許可している可能性があります。しかし、確信は持てません。それは純粋な憶測です。それでは、以下をテストして、何が印刷されるかを確認してみませんか。

        String nm = (String) java.security.AccessController.doPrivileged
            (new sun.security.action.GetPropertyAction
             ("java.awt.graphicsenv", null));

    System.out.println("java.awt.graphicsenv = " + nm );

null を出力すると、問題が何であるかがわかります。システムにそのプロパティがないか、セキュリティで使用が禁止されています。

ここからあなたに伝えるのは非常に難しいです:「ファイル xyz を編集して追加:fail = false」だから、あなたは自分の仕事をして、本当の理由が何であるかを理解しようとしなければなりません。

実行されているコードが何であるかを調査することから始めて (私が投稿したばかりです)、それが何をするのか、そして「AccessController.doPrivileged」がどのように機能するのかを理解してください。(そのためにGoogle + StackOverflowを使用できます)。

于 2009-06-04T17:44:33.250 に答える
5

同様の問題があり、トラブルシューティングを重ねた結果、java.awt.headless物件に関連していることが判明しました。この問題は、JVM オプションを明示的に

-Djava.awt.headless=true
于 2011-11-11T13:32:59.783 に答える
3

1 週間前実行されていましたが、現在は実行されていません。

したがって、「機能している」と「機能していない」の間で何かを変更しました。

作業中の構成に戻り (可能であれば)、変更内容を厳密に追跡します。動作中の構成のバックアップがない場合は、変更内容が見つかるまで、動作中と非動作中の作業を綿密にやり直してください。

コードではない可能性があります-構成ファイルなどである可能性があります.

幸運を祈ります

-R

于 2009-06-04T17:50:13.867 に答える
1

このサーバーはサーバーモードでJavaを実行していますか?AWTクラスにロードされないと聞きました。

于 2009-06-04T17:29:05.350 に答える
1

これを *nix にデプロイしていて、もう X ウィンドウ システムを実行していない場合は、それで説明がつく可能性があります。たとえそうしても、DISPLAY システム変数を JVM を開始するプロセスにエクスポートしていない場合、またはエクスポートしていても実際には有効でない場合、このような問題が発生する可能性があります。

それは少なくとも、Tomcat の構成を変更しなかった理由を説明するでしょうが、それでも問題があります。

于 2009-06-04T18:12:00.273 に答える
0

NoClassDefFoundErrorメッセージがまったくない場合、これは2つのことを意味します。

  1. JVMはすでにクラスのロードを試みましたが、失敗しました。通常、これは、JVMがそのクラスの静的初期化を完了できなかったことを意味します。つまり、任意のstatic フィールドに値を割り当て、任意のstatic { }ブロックを実行できませんでした。多くの場合、これは、この静的初期化を実行するために必要なクラスが欠落しているためです。
  2. Java6ではなくJava5を使用しています(Java 6では、代わりに「クラスxyzを初期化できませんでした」というメッセージが表示されます。)

問題のあるクラスは、名前がシステムプロパティの値であるクラスのようjava.awt.graphicsenvです。このプロパティの値を見つけることから始めます。このクラスをインスタンス化しようとするとどうなりますか?

于 2009-06-04T20:19:27.233 に答える
0

AWT コード内から NoClassDefFoundError を取得しているため、Java が X Windows ライブラリのロードに失敗しているようです。ヘッドレス モード ($DISPLAY が X Windows サーバーを指していない) で実行している場合でも、AWT は画像をレンダリングするために X11 ライブラリのサブセットを必要とすることに注意してください。たとえば、次のリファレンスを参照してください。

http://javatechniques.com/blog/linux-x11-libraries-for-headless-mode

何かが動作を停止し、Java コードが変更されなかった場合は、X11 ライブラリがマシン上で移動またはアンインストールされたか、または何らかの理由で LD_LIBRARY_PATH 環境変数がそれらを指していない可能性があります。

于 2011-12-05T18:02:41.550 に答える