0

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 の機能に絞り込まれていると確信しています。

私の経験では、この種の不思議なエラーNoClassDefFoundErrorClassNotFoundExceptionエラーは、多くの場合、クラス ローダーの取り違えが原因です。たとえば、コンテナーのルート クラスローダーがアプリケーション JAR からクラスをロードしようとしています。しかし、この場合、Insight は私にとってブラック ボックスであり、内部で何をしているのかわかりません。おそらく、Spring クラスはアプリケーションのクラスローダー以外のクラスローダーから来ているのではないかと思います。これは、Spring がアプリケーションのlib. しかし、それは知識に基づいた憶測に過ぎず、たとえそれが正確であったとしても、それを解決する方法がわかりません.

インサイトの仕組みに関するトラブルシューティングや洞察のためのアイデアを歓迎します。

4

1 に答える 1

0

これは、Insight の何らかの制限またはバグによるものであることが判明しました。文句を言っていたクラスは、Insight クラスローダー ( ) でHierarchicalLoop<Loop>問題を引き起こし、それが. 型パラメーターと関係があります。クラスローダーの問題の原因となった 2 つのクラスは次のとおりです。TomcatWeavingInsightClassLoaderClassNotFoundException

public class Loop<ChildType extends Loop> {
    //...
}

public class HierarchicalLoop<ChildType extends Loop> extends Loop<ChildType> {
    //...
}

これは完全に有効な Java であり、他のコンテナー/クラスローダー (Tomcat、Jetty、JUnit) ではこれらのクラスのロードに問題はありません。しかし、何らかの理由でインサイトはそうします。

のサブクラスがありますがHierarchicalLoop、それらはすべてパラメーターLoopとして指定するだけChildTypeなので、パラメーターは実際には必要ありません。そのため、型パラメーターを から削除することで問題を回避できましたHierarchicalLoop

public class HierarchicalLoop extends Loop<Loop> {
    //..
}

これは Insight のバグだと確信しています。報告したいのですが、コミュニティ サポートやバグ報告チャネルが見つかりません。

于 2015-06-01T19:38:40.580 に答える