我在 Tomcat 应用程序中有一个类,它有一个静态初始值设定项。一个错误
被抛入了静态初始化器。
问题是 Tomcat 显示的错误消息不包括“原因”,即未显示该错误的消息和堆栈跟踪。
我可以这样重现问题:
public class BadInitClass
{
static
{
if (System.currentTimeMillis() > 0)
throw new Error("I need to see this message");
}
public void doSomething()
{
System.out.println("functionality here");
}
}
现在,如果我从单元测试中调用这个类:
@Test
public void testStaticInit() throws Exception
{
new BadInitClass().doSomething();
}
然后测试打印出堆栈跟踪和消息:
java.lang.Error: I need to see this message
at mypackage.BadInitClass.<clinit>(BadInitClass.java:8)
at mypackage.BadInitClassTest.testStaticInit(UOneUtilitiesTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
但是,如果我将相同的代码添加到我的 Servlet,则 Tomcat 不会打印消息,只会打印以下内容:
exception
javax.servlet.ServletException: Servlet.init() for servlet MyServlet threw exception
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:662)
root cause
java.lang.NoClassDefFoundError: Could not initialize class mypackage.BadInitClass
mypackage.[calling code here]
datcon.webmail.utils.DispatchedHttpServlet.init(DispatchedHttpServlet.java:77)
MyServlet.init(MyServlet.java:57)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:662)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.37 logs.
我正在运行 Tomcat 6.0.37。
这是 Tomcat 中的错误吗?有什么解决方法吗?
我知道静态初始化器通常不是一个好主意,但我有一些使用它们的遗留代码,如果没有底层错误消息和堆栈跟踪,调试这些问题会非常痛苦。
我注意到单元测试没有 NoClassDefFoundError
-- 这个问题是否与 tomcat 使用的自定义 ClassLoader 有关?
最佳答案
我注意到 NoClassDefFoundError
不允许内部异常:http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html
在这种情况下,如果不修补 Tomcat 的类加载器以抛出不同类型的异常,这可能无法解决?
关于java - Tomcat 6 - 静态初始化程序中的错误被 NoClassDefFoundError 隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19999590/