我有一个基于 Spring 的应用程序(打包成 WAR),它在 Jetty 和“普通”Tomcat 7 中运行良好,但在使用 Spring Insight 部署到 tc Server 时会产生奇怪的 NoClassDefFoundError。找不到它抱怨的类肯定在WEB-INF/lib
文件夹中的 JAR 中(我已经仔细检查过 Tomcat 共享库文件夹中不存在竞争的 JAR)。
这是堆栈跟踪,表明 Spring 认为它无法找到该类HierarchicalLoop
:
java.lang.ClassNotFoundException: com.foo.HierarchicalLoop<com.foo.Loop>
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) ~[na:na]
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) ~[na:na]
... 32 common frames omitted
Wrapped by: java.lang.NoClassDefFoundError: com/foo/HierarchicalLoop<com/foo/Loop>
at java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:1.7.0_60]
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2532) ~[na:1.7.0_60]
at java.lang.Class.getConstructor0(Class.java:2842) ~[na:1.7.0_60]
at java.lang.Class.getDeclaredConstructor(Class.java:2053) ~[na:1.7.0_60]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1094) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
... 26 common frames omitted
Wrapped by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'x12Builder' defined in class path resource [spring/x12-builder-config.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: com/foo/HierarchicalLoop<com/foo/X12Loop>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1101) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
如果我在服务器实例中禁用 Insight,应用程序加载正常,这可以在 3 台不同的机器上重现。正如我所说,WAR 也可以在 Jetty 和 Tomcat 下正确加载(没有 Insight)。所以我很确定它已经缩小到 Insight 所做的事情。
以我的经验,这类神秘NoClassDefFoundError
或ClassNotFoundException
错误通常是由类加载器混淆引起的。例如,容器的根类加载器尝试从应用程序 JAR 加载类。但在这种情况下,Insight 对我来说是一个黑匣子,我不确定它在幕后做了什么。我怀疑 Spring 类可能来自我应用程序的类加载器以外的类加载器,这可以解释为什么 Spring 在应用程序的lib
. 但这只不过是有根据的猜测,即使它是准确的,我也不知道如何解决它。
任何有关故障排除或洞察 Insight 工作原理的想法都值得赞赏。