문제

편집 : 솔루션이 발견되었습니다. 이것은 이상하고 최상의 솔루션은 아니지만 방금 계속해서 Swt.jar와 내 클래스가 동일하게로드되도록 Swt.jar의 클래스를 Swt.jar에 넣었습니다. 클래스 로더. 최상의 솔루션이 아니라 임시 수정입니다

편집 : 여기에 대부분의 코드를 추가했습니다.http://groups.google.com/group/clojure/browse_thread/thread/1d7dd4913b2f9aa7 http://groups.google.com/group/clojure/web/noclassdefissue.zip http://groups.google.com/group/clojure/web/mostcodeissue.java

이것은 이상한 클래스 디프가 찾을 수없는 이상한 오류입니다. 내 코드 작업의 90%가 약간 다른 시나리오는 다음과 같습니다. Clojure를 사용하고 있다는 것을 무시하십시오. 또한 일반 Java 코드 로이 작업을 수행했지만 여전히 동일한 오류가 발생합니다.

이상적으로는 Custom Classloader에 대한 도움을 기대하고있었습니다. 나의 초기 생각은 클래스 로더를 만들고 항아리의 FilePath/URL을 클래스 로더에 추가하고 코드를 시작할 수 있다는 것이었다. 그러나 분명히 약간의 이상한 점이 진행되고 있습니다.

  1. 4-5 auxillary jar 파일을 동적으로로드하는 JAR 파일 하나가 있습니다. 간단한 UrlClassLoader 위에 구축되었습니다. 사용자가 하나의 JAR 파일을 클릭하고 응용 프로그램을 시작할 수 있으므로이 작업을 수행하고 싶습니다. 따라서 사용자가 걱정해야 할 항목이 하나 있습니다.

  2. 이 JAR 파일을 클릭하면 응용 프로그램이 파일 시스템에서 JAR 파일을로드합니다. 예를 들어 응용 프로그램은 Swt.jar (Eclipse의 위젯 툴킷) 및 다른 항아리를로드합니다.

3 (그러나 걱정하지 마십시오), 내 응용 프로그램은 Clojure (Dynamic Programming Language)를 기반으로 구축되었습니다. 첫 번째 출시 응용 프로그램은이 Clojure 스크립트입니다. 내 응용 프로그램의 대부분은 Clojure 스크립트 내에 있습니다.

4. 최대 1-3의 모든 것이 잘 작동합니다. 애플리케이션로드 및 Clojure 스크립트가 실행되고 SWT GUI 응용 프로그램이 실행됩니다.

  1. 다음은 작동하지 않는 부분입니다.

  2. 기존 Java 라이브러리가 있습니다. my-swt-gui.jar라고 부릅니다. 그것은 또한 SWT 응용 프로그램이기도합니다. 기본적으로 또 다른 GUI 응용 프로그램이 이미 구축되었습니다. 현재 Clojure/SWT 응용 프로그램에서 창을로드하려고합니다. 어떤 이유로, Java 지향 라이브러리는 SWT를 인식하지 못하고 NoclassDef 오류가 발생합니다.

여기에 이상한 점이 있습니다. 그리고 나는 이상한 점이있을 수 있다고 생각할 것입니다.

ENTITIS : A. Java 지향 클래스 로더. Java 클래스 로더에서 Clojure 응용 프로그램을 시작합니다. SWT 및 기타 JAR 파일에는이 클래스 로더가로드됩니다. B. 섹션 엔티티에 의해 호출되는 Clojure 지향 코드 a. Clojure 코드는 SWT 기반 GUI 응용 프로그램입니다. B는 잘 작동합니다. C. 다른 GUI 창이 포함 된 Java 코드. 어떤 이유로,이 라이브러리는로드되지 않으며 오류가 발생합니다. noclassdef.

참고 : SWT 클래스가 실제로 클래스 경로에 있거나 noclassfound 예외를 얻을 수 있다는 사실을 알고 있습니다. 나는 그 예외를 얻지 못한다. 다른 일이 일어나고 있습니다.

참고 : SWT가 Win32 DLL을 포함한다는 사실에도 문제가 될 수 있습니까? 아마도 Win32 DLL JAR에 처음으로 액세스 할 수 있지만 Java 코드에서는 작동하지 않습니까? 그러나 그것은 이상합니다. 왜 SWT가 작동하고 작동하지 않습니까?

모든 코드를 보여줄 수는 없습니다. 관련 작품을 보여줄 수 있기를 바랍니다.

메인 클래스 로더 코드는 다음과 같습니다.

 public static final String [] JAVA_LIBRARIES = {
        "lib\\log4j-1.2.15.jar",
        "lib\\octane_commons.jar",
        "lib\\clojure.jar",
        "lib\\swt\\win32\\swt.jar",
        "lib\\jfreechart\\jcommon-1.0.15.jar",
        "lib\\jfreechart\\jfreechart-1.0.12.jar",
        "lib\\jfreechart\\jfreechart-1.0.12-swt.jar",
        "lib\\pdf\\minium.jar",
        "lib\\pdf\\tagsoup-1.2.jar",
        "lib\\pdf\\core-renderer.jar",
        "lib",
        "conf",
        "src"
    };

My classloader code is based on jetty's classloader and it works OK
but I keep get ting classnotdef errors.  Strange ones.  I can see a
clear distinction between classnotfound errors.  If the file path to
the jar is invalid then I get classnotfound, easy to detect and fix.

Here is essentially the classloader code for future reference.

Classpath classpath = new Classpath();

boolean res = classpath.addComponent(libFilePath);

/// Classloader

private class Loader extends URLClassLoader {
        String name;
        Loader(URL[] urls, ClassLoader parent) {
            super(urls, parent);
            name = "StartLoader" + Arrays.asList(urls);
        }

        public String toString() {
            return name;
        }
    }

//// Then set the classloader
//// where the URLs are the JAR libraries:
   URL [] urls = new URL[NUMBER_OF_JARS];
   for (x in urls) {
      urls[i] = new URL("THE JAR PATH");
   }

    ClassLoader parent = Thread.currentThread().getContextClassLoader();
        if (parent == null) {
            parent = Classpath.class.getClassLoader();
        }
        if (parent == null) {

            parent = ClassLoader.getSystemClassLoader();
        }
        return new Loader(urls, parent);

///////////// 

그리고 이것이 제가 Java SWT 창을로드하려했던 방법입니다. 클래스 로더에 대해 인쇄하고 다른 클래스 로더로 변경하려고했습니다.

공개 정적 최종 void createpdfwindowshell (istartService 서비스, 최종 객체 쉘, 최종 개체 GlobalClassLoader) 예외 {

if ((service != null) && (shell != null)) {
    synchronized(service) {
        service.runService();
        Thread.sleep(80);
    }
} else {
    System.err.println("Invalid arguments : service => " + service + " shell =>" + shell);
    return;
} // End of the if //    

final ClassLoader cl = globalClassLoader == null ? service.getClass().getClassLoader() : (ClassLoader) globalClassLoader;
System.out.println("Service Class Loader.1: " +  service.getClass().getClassLoader());  
System.out.println("Service Class Loader.2 : " +  cl);
System.out.println("-----------------");
System.out.println("[From DynaClass.1] : " + cl.loadClass("com.octane.start.services.IStartService"));
System.out.println("[From DynaClass.2] : " + cl.loadClass("org.eclipse.swt.SWT"));                      
System.out.println("[From DynaClass.3] : " + cl.loadClass("org.eclipse.swt.events.SelectionListener"));
System.out.println("-----------------");        

final Class listenerTargetClass = cl.loadClass("org.eclipse.swt.events.SelectionListener");
final ClassLoader newCl = globalClassLoader == null ? service.getClass().getClassLoader() : (ClassLoader) globalClassLoader;

// Now launch the shell //        
//final Class winClass = Class.forName("com.ca.util.gui.SimplePFSXHtmlPDFWin");
final Class winClass = cl.loadClass("com.ca.util.gui.SimplePFSXHtmlPDFWin");
final Method methodCreate = winClass.getMethod("createPDFWindowShell", new Class [] { Object.class });
methodCreate.invoke(null, shell);

}


오류는 다음과 같습니다.

 [java] [INFO : Classpath Loader Check] : valid files=17 / total=17
 [java] [Classpath Loader] - thread class loader parent == false
 [java] [INFO : Classpath Loader Check] : classpath=StartLoader[file:/C%3a/Program%20Files/Java/jdk1.5.0_11/lib/tools.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/log4j-1.2.15.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/octane_commons.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/clojure.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/swt/win32/swt.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jcommon-1.0.15.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12-swt.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/gnujaxp.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/swtgraphics2d.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12-experimental.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/xercesImpl.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/minium.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/tagsoup-1.2.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/core-renderer.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/, file:/C%3a/usr/local/pfs/projects/octane/conf/, file:/C%3a/usr/local/pfs/projects/octane/src/]
 [java] Active threads : 3
 [java] class clojure.lang.Script
 [java] class org.eclipse.swt.SWT
 [java] interface org.eclipse.swt.events.SelectionListener
 [java] class org.apache.log4j.Logger
 [java] class org.xhtmlrenderer.util.XRLog
 [java] [INFO] Thread ID : Thread[Thread-3,5,main]
 [java] Service Class Loader.1: sun.misc.Launcher$AppClassLoader@92e78c
 [java] Service Class Loader.2 : StartLoader[file:/C%3a/Program%20Files/Java/jdk1.5.0_11/lib/tools.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/log4j-1.2.15.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/octane_commons.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/clojure.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/swt/win32/swt.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jcommon-1.0.15.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12-swt.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/gnujaxp.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/swtgraphics2d.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/jfreechart/jfreechart-1.0.12-experimental.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/xercesImpl.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/minium.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/tagsoup-1.2.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/pdf/core-renderer.jar, file:/C%3a/usr/local/pfs/projects/octane/lib/, file:/C%3a/usr/local/pfs/projects/octane/conf/, file:/C%3a/usr/local/pfs/projects/octane/src/]
 [java] -----------------
 [java] [From DynaClass.1] : interface com.octane.start.services.IStartService
 [java] [From DynaClass.2] : class org.eclipse.swt.SWT
 [java] [From DynaClass.3] : interface org.eclipse.swt.events.SelectionListener
 [java] -----------------
 [java] java.lang.reflect.InvocationTargetException
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 [java]     at java.lang.reflect.Method.invoke(Method.java:585)
 [java]     at com.octane.start.OctaneClojureScript.invokeVarInvoke(OctaneClojureScript.java:89)
 [java]     at com.octane.start.OctaneClojureScript.invokeContract(OctaneClojureScript.java:118)
 [java]     at com.octane.start.OctaneClojureScript.main(OctaneClojureScript.java:129)
 [java]     at com.octane.start.services.ClassPathLoaderService.runService(ClassPathLoaderService.java:225)
 [java]     at com.octane.start.OctaneLauncherMain.runClasspathService(OctaneLauncherMain.java:73)
 [java]     at com.octane.start.OctaneLauncherMain.main(OctaneLauncherMain.java:97)
 [java] Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/events/SelectionListener (octane_main_window.clj:0)
 [java]     at clojure.lang.Compiler.eval(Compiler.java:4543)
 [java]     at clojure.lang.Compiler.load(Compiler.java:4857)
 [java]     at clojure.lang.RT.loadResourceScript(RT.java:326)
 [java]     at clojure.lang.RT.loadResourceScript(RT.java:317)
 [java]     at clojure.lang.RT.load(RT.java:395)
 [java]     at clojure.lang.RT.load(RT.java:367)
 [java]     at clojure.core$load__5058$fn__5061.invoke(core.clj:3734)
 [java]     at clojure.core$load__5058.doInvoke(core.clj:3733)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:413)
 [java]     at clojure.core$load_one__5010.invoke(core.clj:3578)
 [java]     at clojure.core$load_lib__5031.doInvoke(core.clj:3615)
 [java]     at clojure.lang.RestFn.applyTo(RestFn.java:147)
 [java]     at clojure.core$apply__3243.doInvoke(core.clj:390)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:443)
 [java]     at clojure.core$load_libs__5043.doInvoke(core.clj:3641)
 [java]     at clojure.lang.RestFn.applyTo(RestFn.java:142)
 [java]     at clojure.core$apply__3243.doInvoke(core.clj:390)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:443)
 [java]     at clojure.core$require__5049.doInvoke(core.clj:3701)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:413)
 [java]     at clojure.lang.Var.invoke(Var.java:346)
 [java]     ... 10 more
 [java] Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/events/SelectionListener
 [java]     at java.lang.Class.getDeclaredMethods0(Native Method)
 [java]     at java.lang.Class.privateGetDeclaredMethods(Class.java:2395)
 [java]     at java.lang.Class.getMethod0(Class.java:2642)
 [java]     at java.lang.Class.getMethod(Class.java:1579)
 [java]     at com.octane.start.PDFDynamicStartWin.createPDFWindowShell(PDFDynamicStartWin.java:39)
 [java]     at octane.toolkit.octane_core_widgets$pdf_handler__2659.invoke(octane_core_widgets.clj:81)
 [java]     at octane.toolkit.octane_core_widgets$fn__2662$fn__2664.invoke(octane_core_widgets.clj:87)
 [java]     at clojure.proxy.org.eclipse.swt.events.SelectionAdapter.widgetSelected(Unknown Source)
 [java]     at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
 [java]     at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
 [java]     at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
 [java]     at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
 [java]     at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
 [java]     at octane.toolkit.octane_main_window$create_gui_window__2990.invoke(octane_main_window.clj:234)
 [java]     at octane.toolkit.octane_main_window$main_1__2994.invoke(octane_main_window.clj:246)
 [java] Processing Time : 6235
 [java]     at octane.toolkit.octane_main_window$_main__2998.doInvoke(octane_main_window.clj:250)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:402)
 [java]     at octane.toolkit.octane_main_window$eval__3001.invoke(octane_main_window.clj:259)
 [java]     at clojure.lang.Compiler.eval(Compiler.java:4532)
 [java]     ... 30 more

-

도움이 되었습니까?

해결책

아동 클래스 로더가로드 한 클래스가 학부모 클래스 로더가 클래스를로드하여 아동 클래스 로더의 형제 자매 중 하나를 동적으로로드하기 위해 클래스를로드하려고하는 간단한 시나리오에서 비슷한 문제를 보았습니다. 어린이가 작동하지 않기 때문에 ->. 부모 관계는 단 하나 일뿐입니다.

모든 코드가 없으면 확실하지 않지만 다음과 같은 일이 일어나고 있다고 생각합니다.

  1. "글로벌"클래스 로더 대의원은 SWT 클래스를로드하기 위해 클래스 로더 A에 대의원
  2. "글로벌"클래스 로더 대의원은 클로 줄기 코드로드하기 위해 클래스 로더 B에 대의원
  3. Clojure Code는 알고있는 유일한 클래스 로더를 통해 SWT 클래스를 동적으로로드하려고합니다.
  4. 클래스 로더 B는 어디서 찾을 수 있는지 모르고

그게 도움이 되나요?

다른 팁

구체적으로 솔루션은 아니지만 이미 존재하는 많은 기능을 복제하는 것처럼 들립니다. 한 자르.

모든 보조 항아리와 함께 코드를 단일 JAR 파일에 묶을 수 있습니다. 1 차 클래스 로더는 런타임에 작동합니다. 커스텀 클래스 로더 코드를 여러 번 쓰지 않아도되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top