com.sun.jndi.ldap.LdapCtxFactory: класс не найден в сервлете - PullRequest
0 голосов
/ 10 августа 2010

Доброе утро / день,

У меня есть проблема с соединителем LDAP, когда я использую его в своем модульном тесте, нет проблем, но когда он вызывался в среде сервера приложений, кажется, есть проблема с classpath, но этот класс поставляется с Java 1.6.17 (версия, которую я использую).

Я использую spring-ldap, чтобы установить соединение.

public static LdapContextSource getLdapContextSource(final String url, final String base) throws Exception {
    LdapContextSource ldapContextSource = new LdapContextSource();

    ldapContextSource.setUrl(url);
    ldapContextSource.setBase(base);
    ldapContextSource.setPooled(true);
    //ldapContextSource.setContextFactory(LdapCtxFactory.class);

    ldapContextSource.afterPropertiesSet();

    return ldapContextSource;
}

Вот лог:

2010-08-10 09:46:38,183 : StandardWrapperValve.invoke : Servlet.service() for servlet default threw exception
java.lang.ClassNotFoundException: com.sun.jndi.ldap.LdapCtxFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at org.ow2.easybeans.loader.EasyBeansClassLoader.findClass(EasyBeansClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
    at org.ow2.easybeans.loader.EasyBeansClassLoader.loadClass(EasyBeansClassLoader.java:238)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.springframework.ldap.core.support.AbstractContextSource.class$(AbstractContextSource.java:67)
    at org.springframework.ldap.core.support.AbstractContextSource.<clinit>(AbstractContextSource.java:67)
    at org.zenithar.security.connectors.impl.ldap.LdapContextFactory.getLdapContextSource(LdapContextFactory.java:16)

Спасибо за все. Привет.

Ответы [ 2 ]

3 голосов
/ 10 августа 2010

Я нашел решение ^^

Это была проблема с Jonas 5, который является сервером приложений, работающим на платформе OSGI. Мое приложение - это обычный основной jar-файл (содержащий контекст Spring с DAO), разделенный на 3 войны. Похоже, что JVM, используемая для размещения общего ядра, отличается от той, что использовалась в 3 войнах.

Я добавляю в свой felix-config.properties

org.osgi.framework.bootdelegation=....
    sun.util.calendar; \
    com.sun.jndi.ldap; \
    version="1.5.0"

И

org.osgi.framework.bootdelegation=com.sun.corba, \
....
com.sun.jndi.ldap.*

Чтобы я мог загрузить com.sun.jndi.ldap.LdapCtxFactory в свое общее ядро.

Спасибо за вашу помощь.

2 голосов
/ 10 августа 2010

Ваш юнит-тест и сервер приложений не должны использовать одну и ту же JRE, если это так. Проверьте, использует ли ваш сервер приложений.

com.sun.jndi.ldap.LdapCtxFactory в rt.jar. Вы можете это подтвердить?

Как вы знаете , что сервер использует ту же JVM? Это работает локально? На что у вас установлен JAVA_HOME? Какой сервер приложений?

Не думайте, что загрузчик классов внезапно перестал работать. Когда вы получаете информацию, которая противоречит вашим предположениям о том, как устроен мир, проверьте свои предположения.

Гораздо более вероятно, что ваш сервер приложений не настроен должным образом, чем загрузчик классов забыл, как выполнять свою работу между успешным тестированием и неудачным развертыванием.

...