访问Tomcat上的GraphicsEnvironment.getLocalGraphicsEnvironment时出现NoClassDefFoundError

时间:2009-06-04 17:25:26

标签: java tomcat noclassdeffounderror

我有一个在tomcat上运行的应用程序,其中一种方法是,从jpeg图像创建一个简单的缩略图。这些功能在离线状态下运行良好,一周前也在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无头模式无法解决问题。 在另一个项目中完全相同的代码,但在此服务器上的axis2 webservice内工作正常。 [/编辑]

7 个答案:

答案 0 :(得分:7)

好像你改变了Tomcat的配置。

您已更改为l {0,1} [iu] n [iu] x框或安装在具有不同于您测试它的安全控制的虚拟机上。

显然

 GraphicsEnvironment.getLocalGraphicsEnvironment()

正在尝试访问该属性: java.awt.graphicsenv

可能会返回null或某些不存在的类名,然后加载它并抛出ClassNotFoundException。 1

解决方案似乎是指定“java.awt.headless”属性。

这是一个类似的问题:java.awt.Color error

试试这个search,它会显示与您相似的情况。

我记得太阳虫数据库中也有一些东西。

找到解决方案后发布解决方案!

<子> 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配置中运行,或者轴库允许访问该属性。但我们不能确定。这是纯粹的猜测。那么为什么不测试以下内容并看看打印的内容:

        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)。

答案 1 :(得分:4)

我们遇到了类似的问题,经过多次麻烦拍摄后发现它与java.awt.headless属性有关。通过将JVM选项显式设置为

来解决该问题
-Djava.awt.headless=true

答案 2 :(得分:3)

一周前运行,现在不是。

因此,你改变了“工作”和“不工作”之间的差异。

返回工作配置(如果可以),并严格跟踪您更改的内容。如果您没有工作配置的备份,那么请仔细阅读您在工作和非工作之间所做的工作,直到找到您所做的更改为止。

它可能不是代码 - 它可能是配置文件等。

祝你好运,

-R

答案 3 :(得分:1)

此服务器是否在服务器模式下运行java - 我听说在AWT类中没有加载。

答案 4 :(得分:1)

如果你在* nix上部署它,并且你没有运行X窗口系统,那可以解释它。即使你这样做,如果你没有将DISPLAY系统变量导出到启动JVM的进程,或者如果你没有,但它实际上没有效,那么它可能会导致这样的问题。

这至少可以解释为什么你没有在tomcat中更改任何配置,但仍然有问题。

答案 5 :(得分:0)

如果您的NoClassDefFoundError根本没有消息,那么这意味着两件事:

  1. JVM已尝试加载类并且无法加载。通常,这意味着JVM无法完成该类的静态初始化,即为任何static字段分配值并运行任何static { }块。通常,这是因为缺少执行此静态初始化所需的类。
  2. 您使用的是Java 5,而不是Java 6.(在Java 6中,您会收到“无法初始化类 xyz ”消息。)
  3. 问题类似乎是名称是系统属性java.awt.graphicsenv的值的问题类。我首先要找出这个属性的价值。当您尝试实例化此类时会发生什么?

答案 6 :(得分: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环境变量不再指向它们。