NoClassDefFoundError в Websphere - JAR присутствуют - PullRequest
2 голосов
/ 15 декабря 2010

У меня есть простое приложение Spring MVC, которое просматривает некоторые пользовательские данные с сервера LDAP и распечатывает простую HTML-страницу, используя JSP.Приложение отлично работает на Tomcat 6. Оно использует Spring LDAP 1.3.1 и LDAPTemplate для выполнения поиска LDAP.

Однако, когда я развертываю это WAR-приложение в Websphere 7, приложение не запускается - Websphereвозвращает 500 Внутренняя ошибка сервера.Глядя на файл журнала Websphere, я вижу

[14/12/10 14:50:09:169 GMT] 00000022 DispatcherSer E org.springframework.web.servlet.FrameworkServlet initServletBean Context initialization failed
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.ldap.core.support.LdapContextSource] for bean with name 'contextSource' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org.springframework.beans.factory.InitializingBean
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:576)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1319)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:885)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)

В моем каталоге web-inf \ lib есть все файлы JAR, включая org.springframework.beans-3.0.5.RELEASE.jar, который содержит InitializingBean.Поэтому я не уверен, почему Websphere сообщает об отсутствии класса.

Содержимое моего web-inf \ lib:

aopalliance.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
commons-pool-1.5.4.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
ldapbp-1.0.jar
org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.oxm-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
spring-ldap-1.3.1.RELEASE-all.jar

А вот определение компонента contextSource, которыйWebsphere испытывает проблемы с загрузкой (имя пользователя / пароль действительны и работает с Tomcat):

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="url" value="ldaps://moo.example.com:1300/" />
  <property name="userDn" value="CN=foo,OU=baz,DC=bar,DC=blat,DC=org" />
  <property name="password" value="*******" />
</bean>

Я был бы очень рад, если бы кто-то мог указать, почему это не работает на Websphere.Я не слишком уверен в правилах загрузки классов в Websphere и буду признателен за любые советы по этому поводу.

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Включить трассировку загрузки классов. Это скажет вам, какие классы загружены и из какого Jar. Как упомянул Саджан, есть вероятность, что в пути к классам есть дубликаты jar и загрузчик классов, который, как вы ожидаете, не загрузил этот класс (и загрузчик родительского класса, вероятно, загрузил класс).

NoClassDefFoundError (NCDFE) действительно означает, что он не может найти класс, который ищет. Ошибки в статической инициализации будут явно выражаться как «java.lang.ExceptionInInitializerError» (EIIE) «

И NCDFE, и EIIE выходят из ошибки Linkage.

Как правило, все эти ошибки можно легко устранить, включив загрузку классов для Сервера. Также используйте средство просмотра загрузчика классов, доступное в консоли администратора, для помощи в устранении неполадок.

НТН Manglu

3 голосов
/ 15 декабря 2010

Это липкое и распространенное исключение.Помните, что NoClassDefFoundError не означает, что класс не был найден, скорее это означает:

NoClassDefFoundError: данный класс мог быть найден, но что-то пошло не так при его инициализации (интерфейс, который он реализовалне удалось найти, что-то пошло не так в статическом инициализаторе и т. д.).

С здесь .

1 голос
/ 04 февраля 2011

Проверьте, не добавили ли вы зависимости в файл pom.xml.

1 голос
/ 15 декабря 2010

Пожалуйста, проверьте, что у вас нет такого же класса в любой другой возможной банке

...