views:

1678

answers:

6

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]

+1  A: 

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

JeeBee
No that's not it, a week ago it did work. The tomcat configuration has not been changed since. I think u see why this error is puzzling me.
Red33mer
Hmm, had an OS upgrade - new version of x.org or nvidia/intel/ati linux drivers? I see that Native method in the stacktrace...
JeeBee
No, i didn't had an Os upgrade.
Red33mer
Oh well. Good luck hunting down the issue!
JeeBee
@JeeBee: I remember something similar, but I don't have a reliable source. Do you remember where did you hear that?
OscarRyz
I wish I had the link to hand but I don't. I suspect it was here at some point in the past. I also suspect that it will still load the AWT classes on demand, maybe the client VM preloads them in anticipation ... I don't know and can't say for sure.
JeeBee
+4  A: 
OscarRyz
No, that's not it. In fact i forgot to mention this, but it isn't really important, in another project where a webservice is deployied with axis2 this function does work, on the same tomcat 5.5 server. I still tried the headless mode, it didn't change anything. The tomcat is the same as a week ago, i can only assume that something in eclipse (not the code) has changed, because there is no other possible expaination, but still i can't figure out a solution.
Red33mer
That would throw an Error, not a NoClassDefFoundError, which is a subclass. And it would report the name of the class it was looking for.
Yishai
@Yishai: Except if NoClassDefFoundError is thrown fist right? The catch section handles 3 Exception but not an error ( because they should not be handled in first place ) If NoClassDefFoundError is thrown it will not be handled in the try/catch and will pop up in the stacktrace ( just as reported by Red33mer ) NoClassDefFoundError != NoClassDefFoundException. http://bit.ly/ncdfe != http://bit.ly/cnfep
OscarRyz
Thanks a lot so far. Executing the suggestion you mentioned above is printing java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment. I get it, it is failing in GraphicsEnvironment localEnv = (GraphicsEnvironment) Class.forName(nm).newInstance();Still i don't know what know do with this knowlege or how to fix the problem. I tried to find a way around using the awt classes, but had no luck so far.
Red33mer
@Red33mer: That's odd, according to this: http://bit.ly/EPSrh and this: http://bit.ly/UzmIZ The problem should be fixed with the "java.awt.headless=true". This entry has the same solution: http://bit.ly/cSy6W
OscarRyz
The thing is, that if u look in the class, the headless feature is executed after the local graphics environment ist created. So headless option doesnt work.
Red33mer
Solved, this was a bug in tomcat 5.5, restarting fixed the problem. Since Oscar took a lot of time to figure out the problem, i will give him the solve check flag ;). Still i would like to thank all guys who took their time to help me.
Red33mer
+2  A: 

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

Huntrods
Yeah i got that, something hast changed, still, i checked out an old version from the svn, still not working, the tomcat configuration has not been changed or even touched since then. This is actually the reason that i'am asking this question, because, i quite frankly can not explain this.
Red33mer
A: 

Likely, something changed in your Classpath. Either the actual classpath changed or it is looking for a file that has been moved. Have you recently done a "clean and deploy"?

Equistatic
+1  A: 

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.

Yishai
Actually i have the exact same function in another project deployied on this tomcat, which is using axis2 instead, and it's working. But if it were a DISPLAY system variable problem, it shouldt work either. I really think that eclipse screwed something up, because i don't see any other possible explaination.
Red33mer
A: 

If your NoClassDefFoundError has no message at all, then this means two things:

  1. The JVM has already tried and failed to load a class. Usually, this means the JVM was unable to complete static initialization for that class, i.e. assign values to any static fields and run any static { } blocks. Often, this is because the classes necessary to do this static initialization are missing.
  2. You're using Java 5, not Java 6. (In Java 6, you get a 'Could not initialize class xyz' message instead.)

The problem class appears to be the one whose name is the value of the system property java.awt.graphicsenv. I would start by finding out the value of this property. What happens when you try to instantiate this class?

Pourquoi Litytestdata