2009-03-26 2 views
1

Jalapeno 프레임 워크를 사용하여 RCP 앱을 캐시 데이터베이스에 연결하려고합니다. 연결이 설정된 후, 나는 정확히으로 Jalapeno 설명서에 같은 테이블에서 모든 데이터를 얻기 위해 노력하고있어 :Eclipse RCP : ClassNotFoundException 또는 다른 클래스 번들로드하는 방법 클래스

if (objManager==null) return; 
DBClass cortege = null; 
try { 
Iterator terms = objManager.openByQuery(DBClass.class, null, null); 
System.out.println("terms ok"); 
while (terms.hasNext()){ 
    System.out.println("has next"); 
    cortege = (DBClass)terms.next(); 
} 

이 코드 컴파일을 terms.next에서 예외

java.lang.RuntimeException: myPluginId.views.DBClass 
at com.intersys.objects.POJOIterator.next(POJOIterator.java:75) 
    ...skip... 
    Caused by: java.lang.ClassNotFoundException: myPlugin.views.DBClass 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at com.jalapeno.runtime.ObjectCopierToPojo.detach(ObjectCopierToPojo.java:76) 
    at com.jalapeno.runtime.ObjectCopierToPojo.findPojo(ObjectCopierToPojo.java:472) 
    at com.intersys.classes.CacheRootObject.detach(CacheRootObject.java:255) 
    at com.intersys.classes.Persistent.detach(Persistent.java:567) 
    at com.intersys.objects.POJOIterator.next(POJOIterator.java:59) 

을 실행하고 trowing(); 전혀 얻을 수 없어요 ... DBClass 클래스의 인스턴스가 방금 생성되었지만 클래스를로드 할 수 없습니다. 그런 다음이 코드를 간단한 Java 응용 프로그램 (이클립스 rcp가 아닌)에 넣으려고했는데 모두 괜찮아졌습니다. 그래서 일부 Eclipse 부분이 클래스 로딩을 차단한다고 생각합니다.

또한 terms.next()를 호출하기 전에 클래스를로드하려고 시도했습니다.

Bundle b = Platform.getBundle("myPluginId"); 
try { 
b.loadClass("DBClass"); 
} catch (ClassNotFoundException e) { 
System.out.println("no class"); 
e.printStackTrace(); 
} 

같은 오류가 발생했습니다. 클래스를로드 할 수 없습니다. 그래서 알려진 문제입니까? 해결책이 있습니까? =========================== 내 플러그인에서 클래스를로드하기 위해 Jalapeno 플러그인을 만드는 방법은 무엇입니까?

+0

이클립스 Google 그룹에서 발견, 그 J alapeno 플러그인과 내 클래스는 같은 클래스 로더에 의해로드되어야합니다 ... 어떻게 해야할지 모르겠다. – Imaskar

+0

그것이 내가 필요한 것입니까? http://wiki.eclipse.org/index.php/BundleProxyClassLoader_recipe 예인 경우 사용 방법은 무엇입니까? – Imaskar

+0

아래 내 대답을 한번보세요,하지만 네, 친구 클래스 로딩이 필요하다고 생각합니다. – nstehr

답변

3

를 추가합니다. Eclipse 클래스 로딩에 대한 자세한 내용은 Alex Blewitt가 Eclipse의 클래스 로딩 시스템에 대한 훌륭한 개요 인 here을 작성했습니다. 그것의 몇 년 오래된, 그러나 대부분은 여전히 ​​관련성이 있습니다.

친구 클래스 로딩의 JIST은 이것이다 :

  • 플러그인이 도움이 로딩 클래스를 필요로 함을 선언합니다. 그것은 이클립스는 사용자가 지정한 버디 클래스 로딩 정책을 사용하려고, 일반 로딩 메커니즘이 실패했을 경우의 친구 플러그인은 버디 정책

  • 를 선언

  • 을 자사의 "친구 플러그인"을 선언하여이 작업을 수행합니다. 당신으로 Jalapeno 플러그인의 MANIFEST.MF 파일에

    Eclipse-BuddyPolicy: registered 
    

    을 넣어 :

따라서 귀하의 경우, 퍼팅 시도

Eclipse-RegisterBuddy: id.of.jalepeno.plugin 

을의 MANIFEST.MF에 당신의 플러그인

+0

! 그것은 도왔다! 한 가지 : 성능을 향상시키고, 정규 메커니즘을 건너 뛰고 (Jalapeno 플러그인의 모든 클래스를 반복한다고 가정), 먼저 buddy-loading을 사용한다. (예상되는 위치에서만 ... 나는 친구로드가 발생할 것을 안다.)? – Imaskar

+0

도움이 되니 기쁩니다! 그러나 두 번째 질문의 경우 성능을 향상시키는 방법에 대해 제 머리 꼭대기에서 어떤 생각을 할 수는 없습니다. – nstehr

+0

좋습니다, 감사합니다. 그대로 두다. – Imaskar

0

잘 모르겠지만 수업이 속한 패키지를 내 보내야 할 수도 있습니다.

선택 MANIFEST "런타임"와 당신은 친구 클래스 로딩을 시도 할 수도 있습니다 모든 패키지

+0

시도했습니다. 여전히 작동하지 않습니다. 덕분에 – Imaskar

관련 문제