Jetty と「通常の」Tomcat 7 で正常に動作する Spring ベースのアプリ (WAR にパッケージ化) がありますが、Spring Insight を使用して tc サーバーにデプロイすると、奇妙な NoClassDefFoundError が生成されます。文句を言っているクラスが見つからないことは間違いなく、WEB-INF/lib
フォルダー内の JAR にあります (Tomcat 共有 lib フォルダーに競合する 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
. しかし、それは知識に基づいた憶測に過ぎず、たとえそれが正確であったとしても、それを解決する方法がわかりません.
インサイトの仕組みに関するトラブルシューティングや洞察のためのアイデアを歓迎します。