[英]Strange Classpath, .NoClassDefFoundError errors
編輯:找到解決方案。 這很奇怪,也不是最好的解決方案,但是我只是繼續將MY JAVA CODE(com。*)這些類放在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
這是奇怪的找不到classdef的錯誤。 這是90%的代碼正常工作的情況。 請忽略我正在使用Clojure,我也使用常規的Java代碼完成了此操作,但仍然收到相同的錯誤。
理想情況下,我希望對自定義類加載器有所幫助。 我最初的想法是,我可以創建類加載器,將jar的文件路徑/ URL添加到類加載器,然后啟動代碼。 但是顯然有一些奇怪的事情正在發生。
我有一個jar文件,可以動態加載4-5個輔助jar文件。 它基於簡單的URLClassLoader構建。 我想要這樣做是因為我可以讓用戶單擊一個jar文件並啟動該應用程序。 因此,用戶必須擔心一項。
通過單擊此jar文件,應用程序將從文件系統加載jar文件。 例如,應用程序加載了swt.jar(Eclipse的小部件工具包)和其他一些jar。
3(但不用擔心),我的應用程序是基於Clojure(動態編程語言)構建的,第一個啟動的應用程序是此Clojure腳本。 我的大部分應用程序都在clojure腳本中。
這是無效的部分。
我有一個現有的Java庫,將其稱為my-swt-gui.jar。 這也是一個swt應用程序。 基本上,這是另一個已構建的gui應用程序。 我正在嘗試從當前的clojure / swt應用程序加載窗口。 由於某些原因,面向JAVA的庫無法識別SWT,並且出現noclassdef錯誤。
這是奇怪的地方。 我會確定我認為可能存在奇怪之處。
實體:A.面向Java的類加載器。 在Java類加載器中,我啟動clojure應用程序。 SWT和其他jar文件都通過該類加載器加載。 B.由節實體a調用的面向Clojure的代碼。 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服務,最終Object Shell,最終Object 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
-
我在一個更簡單的場景中看到了類似的問題,其中子類加載器加載的類試圖獲取父類加載器加載的類,以動態加載子類加載器的同級之一-這是行不通的,因為子類->父母的關系是單向的。
沒有所有代碼,我不能確定,但是我懷疑正在發生以下情況:
有幫助嗎?
這不是一個專門的解決方案,但是聽起來您正在復制One-Jar中已經存在的許多功能。
您可以將代碼以及所有輔助jar捆綁到一個jar文件中。 One-Jar類加載器將在運行時進行處理。 它使我不必多次編寫自定義類加載器代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.