当它应该在rt.jar中时,我为什么不拥有这个类?

时间:2011-10-19 15:55:21

标签: java jar ldap

所以,我正在尝试在java中实现LDAP连接......这需要com.sun.jndi.ldap.LdapCtxFactory。 Jarfinder显示LdapCtxFactory应该包含在rt.jar中,据我所知,这是java SDK的基础。 Eclipse无法找到它(我正在尝试导入它)。

我遇到了类似于此前的问题,但我通过安装包含它的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);

然后我使用哈希表创建Context:

ctxGC = new InitialLdapContext(env, null);

因此,由于我没有com.sun,我无法在哈希表中提供。我还需要第一线吗?我不完全确定它是什么......

4 个答案:

答案 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();
}

答案 1 :(得分:2)

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

java.*javax.*中找到符合您需求的内容。可能是在运行时找到实现的工厂模式。

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

答案 2 :(得分:1)

Android不包含JRE的Web服务API(即javax.naming)

然而,所有评论都非常有用且信息丰富,最终导致我找到了问题的核心。

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

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

答案 3 :(得分:0)

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

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

  

sun。*包不是受支持的公共界面的一部分。   直接调用sun。*包的Java程序不能保证在所有兼容Java的平台上运行。