我有一个在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内工作正常。 [/编辑]
答案 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
根本没有消息,那么这意味着两件事:
static
字段分配值并运行任何static { }
块。通常,这是因为缺少执行此静态初始化所需的类。问题类似乎是名称是系统属性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环境变量不再指向它们。