2010-12-15 41 views
1

J'ai une simple application Spring MVC qui recherche des détails d'utilisateur à partir d'un serveur LDAP et imprime une simple page HTML en utilisant une JSP. L'application fonctionne correctement sur Tomcat 6. Elle utilise Spring LDAP 1.3.1 et LDAPTemplate pour effectuer les recherches LDAP.NoClassDefFoundError dans Websphere - Les fichiers JAR sont présents

Cependant, lorsque je déploie cette application WAR sur Websphere 7, l'application ne s'exécute pas - Websphere renvoie une erreur 500 Internal Server. En regardant le fichier journal de Websphere, je vois

[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) 

Ma web-inf \ lib a tous les fichiers JAR, y compris org.springframework.beans-3.0.5.RELEASE.jar, qui contient InitializingBean. Je ne suis donc pas sûr de savoir pourquoi Websphere signale que la classe est manquante.

Contenu de mon 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 

Et voici la définition du contextSource haricot qui Websphere est d'avoir des difficultés à charger (le nom d'utilisateur/mot de passe est valide et fonctionne avec 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> 

Je serais très heureux si quelqu'un pouvait expliquer pourquoi cela ne fonctionne pas sur Websphere. Je ne suis pas très sûr des règles de chargement de classes dans Websphere et j'apprécierais tout conseil à ce sujet.

Répondre

3

Allumez trace de classe en cours de chargement. Cela vous dirait quelles classes sont chargées et à partir de quel Jar. Comme Sajan l'a mentionné, il y a des chances qu'il y ait des fichiers dupliqués dans le classpath et que le classloader n'a pas chargé cette classe (et un chargeur de classe parent a probablement chargé une classe). NoClassDefFoundError (NCDFE) signifie qu'il n'a pas pu localiser la classe recherchée par NoClassDefFoundError (NCDFE). Les erreurs dans l'initialisation statique se tourneraient explicitement comme « java.lang.ExceptionInInitializerError » (RAAE) "

Les deux NCDFE et RAAE extension de l'erreur de liaison.

En général, toutes ces erreurs peuvent être facilement en tournant analysé les causes sur le chargement des classes pour le serveur. utilisez également le chargeur de classes Viewer disponible dans la console d'administration pour aider dans vos activités de dépannage.

HTH Manglu

+0

Merci Manglu. En parcourant le journal avec le chargement des classes activé, j'ai découvert qu'une version différente du fichier Spring LDAP jar était en cours de chargement à partir d'un autre emplacement car l'administrateur avait stocké une source de contexte Spring LDAP dans JNDI. Définir le classloader pour mon application pour utiliser "parent last" a résolu le problème. – sigint

3

Ceci est une exception collante et commune. Rappelez-vous, que NoClassDefFoundError ne signifie pas que la classe n'a pas été trouvé, cela signifie plutôt:

NoClassDefFoundError: The given class could be found, but something went wrong when initializing it (an interface it implemented could not be found, something went wrong in a static initializer etc.).

De here.

1

S'il vous plaît vérifier que vous ne disposez pas de la même classe dans un autre pot possible

1

S'il vous plaît vérifier si vous avez ajouté les dépendances dans le fichier pom.xml

+0

Je suppose qu'il obtiendrait ClassNotFound alors – kboom