2011-10-19 3 views
3

그래서, 자바에서 LDAP 연결을 구현하려고합니다 ... com.sun.jndi.ldap.LdapCtxFactory이 필요합니다. Jarfinder는 LdapCtxFactoryrt.jar에 포함되어야한다고 설명합니다.이 내용은 Java SDK의 기초입니다. Eclipse에서 찾을 수 없습니다 (가져 오려고합니다).rt.jar에있을 때이 클래스를 사용하지 않는 이유는 무엇입니까?

이전과 비슷한 문제가 있었지만이를 포함하는 jar 파일을 설치하여 해결했습니다 ........ 이제는 포함 된 jar 파일이 기본값이므로 혼란 스럽습니다. 항아리?

참고 이것은 (는) 안드로이드 프로젝트의 일부입니다. 차이가 있니?

편집

내가이 패키지를 사용하고있는 다음

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

이것은 썬/오라클 특정 클래스와 그것을 가지고하지 않을 수 있습니다 다른 Java 배포판처럼 보인다. 어떤 Java를 사용합니까 (Oracle, OpenJDK, ...)? – Thomas

+0

Oracle에서 SDK를 다운로드했으며 Eclipse를 사용합니다 ... Eclipse가 가져온 SDK가 무엇인지 잘 모릅니다. – Cody

답변

1

안드로이드는 JRE에서 웹 서비스 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, Try [jldap] (http://www.openldap.org/jldap/) –

+0

불행히도 모든 JNDI 튜토리얼은 이것을 기본 기술로 제공합니다. 다른 답에서와 같이 그렇지 않습니다. – EJP

2

"com.sun"으로 시작하는 패키지는 일반적으로 Sun의 Java 런타임 구현에만 해당됩니다. 이것들은 구현에서 사용되는 내부 클래스이거나 API의 기본 구현 일 수 있습니다. 내부 패키지 명과 클래스가 다른 Java SE의 구현이 존재하기 때문에, 런타임시의 이식성을 해치기 때문에, com.sun.* 클래스를 사용하는 것은 매우 안전하지 않습니다.

java.* 또는 javax.*에서 필요한 것을 찾는 것을 찾으십시오. 아마도 런타임에 구현을 찾는 팩토리 패턴 일 것입니다.

수정 : 다른 답변에 대한 귀하의 의견에 ... InitialLdapContext을 생성하고 목적에 맞는 생성자를 사용하고 newInstance 메서드를 호출하십시오. 그러면 사용할 수있는 LdapContext 인스턴스가 제공됩니다. 후자는 단지 하나의 인터페이스 일뿐 정확한 구현은 숨겨져 있습니다. 그것은 서비스 인터페이스 제공 업체입니다.

+0

내가 공장을 어떻게 사용하고 있는지에 대한 더 많은 정보를 추가했습니다. – Cody

+0

이전에 언급 한 의견을 읽으면 무시하십시오. 처음 해시 테이블 항목을 보지 못했습니다. –

4

Eclipse는 its concept of "access rules".으로 코어 Java API의 일부가 아닌 구현 특정 클래스를 숨 깁니다.이를 무시할 수 있지만 그렇게하는 것은 위험합니다. 예를 들어, 필자는 안드로이드 디바이스에서 썬의 구현을 사용할 수 없다고 생각한다.

대신

, 단지 initial context of the right type,를 만들고 프레임 워크를 백업 할 수있는 권리 구현을 찾을 수 있습니다 :

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

방금 ​​더 많은 정보로 내 게시물을 편집했습니다. 조금 바뀔 수도 있습니다. – Cody

+0

+1, 이클립스 숨겨진 클래스를 몰랐습니다. –

+1

@DoctorOreo :'Context.INITIAL_CONTEXT_FACTORY' 속성을 지정하지 않고 시도해보십시오. 보통, 나는 초기 컨텍스트를 생성 한 다음,''ldap : URL을''String ''으로 사용하여 그것에 대한 검색을 수행한다 : LdapContext ldap = (LdapContext) ctx.lookup ("ldap : //host.y.com/")'나는 좀 더 완벽한 예제를 위해 오래된 코드를 보려고 노력할 것이다. – erickson

관련 문제