NoClassDefFoundError while accessing GraphicsEnvironment.getLocalGraphicsEnvironment on Tomcat

15,171

Solution 1

It seems like you've change the configuration of Tomcat.

Either you've changed to a l{0,1}[iu]n[iu]x box or installed on a virtual machine with different security control than the one where you test it.

Apparently the

 GraphicsEnvironment.getLocalGraphicsEnvironment()

Is trying to access the property: java.awt.graphicsenv

Which may return null or some non existing class name which is then loaded and throws the ClassNotFoundException. 1

The solution seems to be specifying the "java.awt.headless" property.

This is a similar question: java.awt.Color error

Try this search , it shows similar situations as your.

I remember there was something in the sun bugs database too.

Post the solution when you find it!

1.GraphicsEnvironment.java

EDIT

It is not eclipse!!

In my original post there is a link to the source code of the class which is throwing the exception.

Since I looks like you miss it, I'll post it here for you:

       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;
      }

That's what gets executed.

And in the original post which you don't seem to have read, I said the code is accessing the property "java.awt.graphicsenv"

If that other project using axis doesn't have the same problem it may be because it may be running in a different tomcat configuration or the axis library allowed the access to that property. But we cannot be sure. That's pure speculation. So why don't you test the following and see what gets printed:

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

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

It it prints null then you now what the problem is. You don't have that property in your system, or the security forbids you do use it.

It is very hard to tell you from here: "Go and edit file xyz and add : fail = false" So you have to do your work and try to figure out what's the real reason.

Start by researching what's the code being executed is ( which I have just posted ) and follow by understand what it does and how does all that "AccessController.doPrivileged" works. (You may use Google + StackOverflow for that).

Solution 2

We had a similar issue and after much trouble shooting it was identified to be related to the java.awt.headless property. The issue was resolved by explicitly setting the JVM option to

-Djava.awt.headless=true

Solution 3

It was running a week ago, and now it is not.

THEREFORE, YOU CHANGED SOMETHING BETWEEN "working" and "not working".

Go back to the working config (if you can), and rigorously track what you changed. If you don't have a backup of the working config, then meticulously go back through what you've done between working and non-working until you find what you changed.

It may not be code - it could be a config file, etc.

Best of luck,

-R

Solution 4

If you are deploying this on *nix, and you don't have an X window system running anymore, that could explain it. Even if you do, if you aren't exporting the DISPLAY system variable to the process that starts the JVM, or if you are but it is not actually valid, it could cause such an issue.

That would at least explain why you didn't change any configuration in tomcat, but still have a problem.

Solution 5

Is this server running java in server mode - I hear that doesn't load in the AWT classes.

Share:
15,171
Red33mer
Author by

Red33mer

About who?

Updated on June 11, 2022

Comments

  • Red33mer
    Red33mer almost 2 years

    I have an application which is running on tomcat, one of the methods is, creating a simple thumbnail from an jpeg image. The functions works fine offline and a week ago also on tomcat. But now i get the following error:

    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)
    

    I don't think that i have change anything what should influence this (actually i didn't change the function at all according to the svn repository), so it must be a library problem. But i can't figure out what is missing. Here are the actual lines from the getThumbnail function, where the error occures:

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

    [edit] I decided to update the problem description a little. Yes it seems that he can not find some class from java.awt or one related to that. But they do exist on the server in the jvm. Java headless mode doesn't solve the problem. In another project the exact same code, but inside an axis2 webservice on this server is working fine. [/edit]