[英]jar-in-jar class loading issue
我按照創建跨平台Java SWT應用程序中描述的步驟進行操作。 我使用swt庫創建了一個包含swt_browser.jar的jar,其中只包含我的類。 然后我添加了其他特定於platrom的swt罐子。 我使用下面的代碼加載swt_browser.jar和特定於平台的swt庫jar。 但不知何故,加載類SWTBrowser的調用抱怨:
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});
你的jar有以下文件結構:
您正在設置以下ClassLoaders:
Main類加載器在其類路徑中具有以下所有內容:
SWT類加載器在運行時構造,並在其類路徑上具有以下內容:
您的加載代碼要求SWT類加載器加載SWT類並且可以正常工作。 但是,您要求它加載應用程序類。 它不知道您的應用程序類,因此它委托給它的父類Main類加載器。 這設法加載您的應用程序類,然后嘗試引用SWT類。 此引用由加載應用程序類的類加載器(Main類加載器)處理。 這不知道SWT類並拋出異常。
您需要以不同方式打包應用程序。 您需要具有以下類加載器。
Main類加載器在其類路徑中具有以下所有內容:
SWT類加載器在運行時構造,並在其類路徑上具有以下內容:
這意味着當您加載應用程序類時,它將由SWT類加載器加載。 這意味着當您的應用引用SWT類時,將使用正確的類加載器。
有關此示例,您可以下載並檢查以下jar: https : //github.com/downloads/mchr3k/org.intrace/intrace-ui.jar
編輯:生成intrace-ui.jar的ant構建文件可以在這里看到: https : //github.com/mchr3k/org.intrace/blob/master/org.intrace/build.xml
特別是,“罐子”目標處理包裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.