我有一个正在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 Web服务内部运行正常。[/编辑]
似乎您已经更改了Tomcat的配置。
您已更改为al {0,1} nxx盒,或已安装在具有与测试安全性不同的安全控制的虚拟机上。
显然
GraphicsEnvironment.getLocalGraphicsEnvironment()
尝试访问属性: java.awt.graphicsenv
它可能返回null或一些不存在的类名,然后将其加载并抛出ClassNotFoundException。1个
解决方案似乎是指定“ java.awt.headless”属性。
尝试此搜索,它显示与您类似的情况。
我记得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)。