Почему у меня нет этого класса, когда он должен быть в rt.jar? - PullRequest
3 голосов
/ 19 октября 2011

Итак, я пытаюсь реализовать соединение LDAP в Java ... это требует com.sun.jndi.ldap.LdapCtxFactory. Джарфиндер показывает, что 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);

А потом я создаю Контекст, используя хеш-таблицу:

ctxGC = new InitialLdapContext(env, null);

Итак, поскольку у меня нет com.sun, я не могу указать это в хэш-таблице. Мне вообще нужна эта первая строка? Я не совсем уверен, что это за ...

Ответы [ 4 ]

4 голосов
/ 19 октября 2011

Eclipse скрывает специфичные для реализации классы, которые не являются частью основного Java API, с его концепцией «правил доступа». Вы можете переопределить это, но это опасно.Например, я очень сильно подозреваю, что реализация Sun не будет доступна на устройстве Android.

Вместо этого просто создайте исходный контекст правильного типа, , и позвольте каркасунайдите правильную реализацию для ее резервного копирования:

LdapContext ctx = new InitialLdapContext();
try {
  /* Use the context... */
} finally {
  ctx.close();
}
2 голосов
/ 19 октября 2011

Пакеты, начинающиеся с "com.sun", обычно относятся к реализации времени выполнения Java от Sun.Это могут быть внутренние классы, используемые реализацией, или реализации API по умолчанию.Поскольку существуют разные реализации Java SE, которые могут иметь разные внутренние имена пакетов и классы, использование любого класса com.sun.* очень небезопасно, так как это вредит переносимости в среде выполнения.

Найти что-то в java.* или javax.*это делает то, что вам нужно.Вероятно, фабричный шаблон, который находит реализацию во время выполнения.

РЕДАКТИРОВАТЬ: в ответ на ваш комментарий в другом ответе ... Создайте InitialLdapContext , используя конструктор, который подходит для ваших целей, затемвызовите newInstance метод для этого.Это предоставит вам экземпляр LdapContext, который вы можете использовать.Последний является только интерфейсом, поэтому точная реализация скрыта.Это провайдеры сервисных интерфейсов на работе для тебя.

1 голос
/ 20 октября 2011

Android не включает API веб-сервисов из JRE (т. Е. Javax.naming)

Однако все комментарии были очень полезными и информативными, и именно это в конечном итоге привело меня к поиску сути проблемы..

Мне нужно было скачать другую библиотеку, библиотеку UnboundId.

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

0 голосов
/ 19 октября 2011

Классы com.sun являются частью реализации Sun и не являются частью поддерживаемых библиотек Java.Вы не должны полагаться на то, что они являются частью всех дистрибутивов, и не должны полагаться на то, что они существуют от версии к версии.

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

Пакеты Sun. * не являютсяподдерживаемый, общедоступный интерфейс.Программа Java, которая напрямую вызывает пакеты sun. *, Не гарантированно работает на всех Java-совместимых платформах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...