簡體   English   中英

jar-in-jar類加載問題

[英]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:

  • 主要的類加載器
    • SWT類加載器

Main類加載器在其類路徑中具有以下所有內容:

  • 你的應用課程
  • jar-in-jar類加載器

SWT類加載器在運行時構造,並在其類路徑上具有以下內容:

  • 適合您平台的SWT課程

您的加載代碼要求SWT類加載器加載SWT類並且可以正常工作。 但是,您要求它加載應用程序類。 它不知道您的應用程序類,因此它委托給它的父類Main類加載器。 這設法加載您的應用程序類,然后嘗試引用SWT類。 此引用由加載應用程序類的類加載器(Main類加載器)處理。 這不知道SWT類並拋出異常。

您需要以不同方式打包應用程序。 您需要具有以下類加載器。

  • 主要的類加載器
    • SWT類加載器

Main類加載器在其類路徑中具有以下所有內容:

  • 一個應用程序類,用於處理構建SWT類加載器
  • jar-in-jar類加載器

SWT類加載器在運行時構造,並在其類路徑上具有以下內容:

  • 適合您平台的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM