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

Red*_*mer 6 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)
Run Code Online (Sandbox Code Playgroud)

我不认为我已经改变了应该影响它的任何东西(实际上我没有根据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);
Run Code Online (Sandbox Code Playgroud)

[编辑]我决定稍微更新问题描述.是的,似乎他找不到java.awt中的某个类或与之相关的类.但它们确实存在于jvm中的服务器上.Java无头模式无法解决问题.在另一个项目中完全相同的代码,但在此服务器上的axis2 webservice内工作正常.[/编辑]

Osc*_*Ryz 7

看起来你已经改变了Tomcat的配置.

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

显然是

 GraphicsEnvironment.getLocalGraphicsEnvironment()
Run Code Online (Sandbox Code Playgroud)

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

这可能会返回null或一些非现有的类名,然后加载它并抛出ClassNotFoundException.1

解决方案似乎是指定"java.awt.headless"属性.

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

尝试此搜索,它会显示与您类似的情况.

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

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

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;
      }
Run Code Online (Sandbox Code Playgroud)

这就是被执行的东西.

在你似乎没有阅读的原始帖子中,我说代码正在访问属性"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 );
Run Code Online (Sandbox Code Playgroud)

它打印null然后你现在问题是什么.您的系统中没有该属性,或者安全禁止您使用该属性.

很难从这里告诉你:"去编辑文件xyz并添加:fail = false "所以你必须做你的工作并试图弄清楚究竟是什么原因.

首先研究正在执行的代码(我刚发布的代码),然后了解它的作用以及"AccessController.doPrivileged"的工作原理.(您可以使用Google + StackOverflow).


小智 5

我们遇到了类似的问题,经过大量的麻烦射击后,发现它与java.awt.headless房产有关。通过将JVM选项显式设置为可以解决此问题

-Djava.awt.headless=true
Run Code Online (Sandbox Code Playgroud)