2011-08-04 4 views
0

나는 Create cross platform Java SWT Application에 설명 된 단계를 따랐습니다. swt 라이브러리를 사용하는 클래스 만 포함하는 swt_browser.jar가있는 jar 파일을 만듭니다. 그런 다음 다른 platrom 특정 swt 항아리를 추가했습니다. 아래 코드를 사용하여 swt_browser.jar 및 플랫폼 별 swt 라이브러리 jar를로드합니다. 하지만 SWTBrowser 클래스를로드하는 호출이 불평합니다 :jar-in-jar 클래스 로딩 문제

java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Layout 

내가 뭘 잘못하고 있는지 말할 수 있습니까?

----- 로딩 SWT 단지에 대한 코드 -------

ClassLoader parent = Main.class.getClassLoader(); 
      URL.setURLStreamHandlerFactory(new RsrcURLStreamHandlerFactory(parent)); 
      URL swtBrowserFileUrl = new URL("rsrc:swt_browser.jar"); 
      URL swtFileUrl = new URL("rsrc:" + swtFileName); 

      ClassLoader cl = new URLClassLoader(new URL[]{swtBrowserFileUrl, swtFileUrl}, parent); 
      Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); 
      addUrlMethod.setAccessible(true); 
      addUrlMethod.invoke(cl, swtBrowserFileUrl); 
      addUrlMethod.invoke(cl, swtFileUrl); 
      Thread.currentThread().setContextClassLoader(cl); 
      try { 
       // Check we can now load the SWT class -this check passes! 
       Class.forName("org.eclipse.swt.widgets.Layout", true, cl); 
      } catch (ClassNotFoundException exx) { 
       System.err.println("Launch failed: Failed to load SWT class from jar: " + swtFileName); 
       throw new RuntimeException(exx); 
      } 

      //this line below throws exception : java.lang.ClassNotFoundException:  org.eclipse.swt.widgets.Layout 

      Class<?> c = Class.forName("com.sun.star.google.gui.SWTBrowser", true, cl); 

      Object obj = c.newInstance(); 
      Method run = c.getMethod("run", url.getClass()); //$NON-NLS-1$ 
      run.invoke(obj, new Object[]{url}); 

답변

2

귀하의 항아리 다음 파일 구조가 있습니다

file structure

당신은 위로 설정됩니다 다음 클래스 로더 :

  • 메인 클래스 로더
    • SWT 클래스 로더

메인 클래스 로더는 클래스 패스에 다음의 모든 사항이 있습니다

  • 앱 클래스를
  • 항아리 -에 - 항아리 클래스 로더

SWT 클래스 로더는 런타임에 생성되며 클래스 경로에서 다음을가집니다. 해당 플랫폼에 대한

  • SWT 클래스

귀하의 로딩 코드는 SWT 클래스를로드 할 SWT 클래스 로더를 요청하고 그 작동합니다. 그러나 응용 프로그램 클래스를로드하도록 요청합니다. 응용 프로그램 클래스에 대해 알지 못하기 때문에 상위 클래스 인 Main 클래스 로더에 위임합니다. 이 클래스를 사용하여 응용 프로그램 클래스를로드 한 다음 SWT 클래스를 참조하려고합니다. 이 참조는 응용 프로그램 클래스 인 Main 클래스 로더를로드 한 클래스 로더에 의해 처리됩니다. 이것은 SWT 클래스에 대해 알지 못하며 예외를 throw합니다.

응용 프로그램을 다르게 패키지해야합니다. 다음 클래스 로더가 필요합니다.를 구축 처리

  • 하나의 응용 프로그램 클래스 :

    • 메인 클래스 로더
      • SWT 클래스 로더

    메인 클래스 로더는 클래스 패스에 다음의 다있다 SWT 클래스 로더

  • SWT 클래스 로더는 런타임에 구성하고, 그 클래스 경로에 다음을 가지고있다

항아리 -에 - 항아리 클래스 로더 : 당신의 플랫폼

  • SWT 클래스
  • 앱 클래스

이것은 앱 클래스를로드 할 때 SWT 클래스 로더에 의해로드된다는 것을 의미합니다. 이것은 앱이 SWT 클래스를 참조 할 때 올바른 클래스 로더가 사용됨을 의미합니다. https://github.com/downloads/mchr3k/org.intrace/intrace-ui.jar

편집 : 이것의 작동 예를 들어

, 다음 항아리를 다운로드하고 검사 할 수 있습니다 특히 https://github.com/mchr3k/org.intrace/blob/master/org.intrace/build.xml

: intrace-ui.jar 여기에서 볼 수 있습니다 생산 개미 빌드 파일을 , "jar"타겟이 패키징을 처리합니다.

+0

감사합니다. -i'll은 곧이 작업을 시도합니다. 조금 피곤해지기 때문에이 클래스 로딩 과정에서 약간 혼란 스럽습니다. – othman

+0

나는 혼란에 빠졌습니다! 나는 무엇을 넣을 지 모른다! - 일부 코드 및이 설명을 일부 코드 단편에 패키지하는 방법에 대한 설명을 추가 할 수 있습니까? – othman

+0

intrace-ui.jar의 ant 빌드 스크립트에 대한 링크를 추가했습니다. 당신이 혼란 스럽다는 것을 정확히 설명 할 수 있습니까? – mchr