У меня есть приложение на основе Spring (упакованное в WAR), которое отлично работает в Jetty и «обычном» Tomcat 7, но выдает странный NoClassDefFoundError при развертывании на tc Server с помощью Spring Insight. Класс, который он жалуется, что не может быть найден, определенно находится в JAR в папке WEB-INF/lib
(и я дважды проверил, что в общей папке 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 не может видеть классы из JAR-файлов в файле lib
приложения. Но это не более чем обоснованное предположение, и даже если бы оно было точным, я понятия не имею, как его разрешить.
Приветствуются любые идеи по устранению неполадок или понимание того, как работает Insight.