【问题标题】:com.sun.jndi.ldap.LdapCtxFactory : class not found in servletcom.sun.jndi.ldap.LdapCtxFactory:在 servlet 中找不到类
【发布时间】:2010-08-10 08:26:19
【问题描述】:

早上好/下午,

我的LDAP连接器有问题,当我在单元测试中使用它时没有问题,但是在应用程序服务器环境中调用它时,似乎有类路径问题,但是这个类是用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)

谢谢大家。 问候。

【问题讨论】:

    标签: java spring ldap jndi


    【解决方案1】:

    我找到了解决办法^^

    Jonas 5 存在问题,它是在 OSGI 平台上运行的应用服务器。 我的应用程序是一个由 3 次战争共享的通用核心 jar(包含带有 DAO 的 spring 上下文)。看来用于托管公共内核的JVM与用于3战的JVM不一样。

    我添加到我的 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.*
    

    这样我就可以在我的 Common Core 中加载 com.sun.jndi.ldap.LdapCtxFactory。

    感谢您的帮助。

    【讨论】:

      【解决方案2】:

      如果是这种情况,您的单元测试和应用服务器不得使用相同的 JRE。检查您的应用服务器正在使用什么。

      com.sun.jndi.ldap.LdapCtxFactory 在 rt.jar 中。你能验证吗?

      您如何知道服务器正在使用相同的 JVM?它在本地运行吗?您将 JAVA_HOME 设置为什么?哪个应用服务器?

      不要假设类加载器突然停止工作。当您获得的信息与您对世界运作方式的假设相矛盾时,请检查您的假设。

      您的应用服务器配置不正确的可能性远大于类加载器忘记如何在您的成功测试和不成功部署之间完成其工作。

      【讨论】:

      • 它是同一个虚拟机(1.6.0u17),我尝试更新到 u21 但它是同样的错误。
      • 这似乎是一个类加载器的问题......有什么建议吗?
      • 可能是 OSGi 问题,我在 Jonas 5.1 上运行我的 web 应用程序。调查正在进行中...
      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2012-11-01
      • 2017-07-11
      • 1970-01-01
      • 2023-03-28
      • 2012-05-23
      • 1970-01-01
      • 2013-04-09
      相关资源
      最近更新 更多