代码之家  ›  专栏  ›  技术社区  ›  Berlin Brown

奇怪的课堂。NoClassDefFound错误

  •  0
  • Berlin Brown  · 技术社区  · 16 年前

    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

    1. 通过单击此jar文件,应用程序将从文件系统加载jar文件。例如,应用程序加载swt.jar(Eclipse的小部件工具包)和其他一些jar。

    4.1-3以内的一切都正常。应用程序加载并运行clojure脚本,SWT GUI应用程序运行等。

    1. 这是不起作用的部分。

    注意:我知道SWT类实际上在类路径中,否则我会得到一个NoClassFound异常。我没有得到这个例外。还有别的事情在发生。

    注意:SWT包含win32 dll这一事实也可能是一个问题吗?也许第一次访问win32dll 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);
    
    ///////////// 
    

    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
    

    2 回复  |  直到 9 年前
        1
  •  3
  •   David Moles paddy-p    16 年前

    如果没有所有的代码,我无法确定,但我怀疑发生了以下情况:

    1. “全局”类加载器委托类加载器A加载SWT类
    2. Clojure代码试图通过它所知道的唯一类加载器(即类加载器B)动态加载SWT类

        2
  •  -1
  •   James Van Huis    16 年前

    不是一个具体的解决方案,但听起来你在复制中已经存在的许多功能 One-Jar .