2011-10-19 38 views
3

所以,我试图在java中实现LDAP连接...这需要com.sun.jndi.ldap.LdapCtxFactory。 Jarfinder显示LdapCtxFactory应该包含在rt.jar中,这对我来说是java SDK的基础。 Eclipse无法找到它(我试图导入它)。为什么我应该在rt.jar中没有这门课?

我有一个问题类似于此前,但我解决了它通过安装包含它的jar ........现在我超级困惑,因为它所包含的jar是默认的罐?

注意这也是Android项目的一部分。这会有所作为吗?

编辑

当我使用这个包是:

Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, ldapHost); 
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, user + "@" + domain); 
env.put(Context.SECURITY_CREDENTIALS, pass); 

再后来就我使用哈希表创建上下文:

ctxGC = new InitialLdapContext(env, null); 

所以,因为我没有com.sun,我不能在散列表中提供这个。我甚至需要第一行吗?我不完全确定它是什么...

+0

这看起来像一个太阳/ Oracle的特定类和其他Java发行版可能没有它。你使用哪个Java(Oracle,OpenJDK,...)? – Thomas

+0

我从Oracle下载了SDK,并使用Eclipse ......不确定Eclipse带来了什么。 – Cody

回答

1

Android不包括从JRE Web服务API(即javax.naming中)

然而,所有的评论都非常有用和信息丰富,最终导致我发现问题的核心。

我需要下载另一个库UnboundId库。

http://www.unboundid.com/products/ldapsdk/

0

com.sun类是Sun的实现的一部分,而不是支持的Java库的一部分。你不应该依赖它们成为所有发行版的一部分,并且不应该依赖于它们从版本到版本的存在。

http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html

太阳。*包不支持的,公共接口的一部分。 直接调用sun。*软件包的Java程序不保证能够在所有Java兼容的平台上工作。

+0

那我怎样才能得到这个文件呢?或者有另一种方法可以获得LdapContextFactory? – Cody

+0

@DoctorOreo,尝试[jldap](http://www.openldap.org/jldap/) –

+0

不幸的是,所有的JNDI教程都将此作为主要技术。它不是,如其他答案所示。 – EJP

2

以“com.sun”开头的包通常是特定于来自Sun的Java运行时实现的。这些可以是实现使用的内部类,也可以是API的默认实现。由于存在不同的Java SE实现,它们可能具有不同的内部包名称和类,因此使用任何com.sun.*类都非常不安全,因为它危害运行时间之间的可移植性。

java.*javax.*中找到你需要的东西。可能是在运行时发现实现的工厂模式。

编辑:回复您在其他答案中的评论...使用适合您的目的的构造函数创建InitialLdapContext,然后调用其上的newInstance方法。这将为您提供一个您可以使用的LdapContext实例。后者只是一个接口,所以确切的实现是隐藏的。这是为ya工作的服务接口提供商。

+0

我添加了更多信息,关于我如何使用工厂 – Cody

+0

如果您阅读我以前放在这里的评论,请忽略它。没有看到第一个哈希表条目。 –

4

Eclipse隐藏了不属于核心Java API的特定于实现的类,其中包含its concept of "access rules".您可以重写此操作,但这样做很危险。例如,我非常强烈地怀疑,Sun的实现不会在Android设备上可用。

相反,只是创建一个initial context of the right type,,让框架找到合适的实现将它备份起来:

LdapContext ctx = new InitialLdapContext(); 
try { 
    /* Use the context... */ 
} finally { 
    ctx.close(); 
} 
+0

我刚刚编辑了我的帖子以获得更多信息,它可能会改变一些 – Cody

+0

+1,不知道Eclipse是否隐藏了这些类。 –

+1

@DoctorOreo:尝试它,而不指定任何'Context.INITIAL_CONTEXT_FACTORY'属性。通常,我创建一个初始上下文,然后用''ldap:“'URL查找它作为'String':'LdapContext ldap =(LdapContext)ctx.lookup(”ldap://host.y.com /“)'我会尝试查看一些更旧的代码以获得更完整的示例。 – erickson

相关问题