проблема загрузки класса jar-in-jar - PullRequest
0 голосов
/ 04 августа 2011

Я выполнил шаги, описанные в Создание кроссплатформенного Java SWT-приложения .я создаю флягу, у которой есть swt_browser.jar, содержащий только мой класс, используя библиотеку swt.Затем я добавил другие специфичные для Platrom банки SWT.Я использую приведенный ниже код для загрузки swt_browser.jar и jar библиотеки SWT для конкретной платформы.но каким-то образом вызов для загрузки класса 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});

1 Ответ

2 голосов
/ 05 августа 2011

Ваш файл jar имеет следующую структуру файлов:

file structure

Вы настраиваете следующие загрузчики классов:

  • Основной загрузчик классов
    • SWT classloader

Основной загрузчик классов имеет все следующие данные в своем пути к классам:

  • Ваши классы приложений
  • Баночка-in-jar classloader

Загрузчик классов SWT создается во время выполнения и имеет следующий путь к классам:

  • Классы SWT для вашей платформы

Ваш код загрузки просит загрузчик классов SWT загрузить класс SWT, и это работает.Однако затем вы просите его загрузить класс приложения.Он не знает о вашем классе приложения, поэтому делегирует его родителю, главному загрузчику классов.Это позволяет загрузить ваш класс приложения, который затем пытается ссылаться на класс SWT.Эта ссылка обрабатывается загрузчиком классов, который загрузил класс вашего приложения - основным загрузчиком классов.Он не знает о классе SWT и выдает исключение.

Вам необходимо упаковать приложение по-другому.Вам необходимо иметь следующие загрузчики классов.

  • Главный загрузчик классов
    • SWT classloader

Главный загрузчик классов имеет все следующиена своем пути к классам:

  • Один класс приложения, который обрабатывает создание загрузчика классов SWT
  • Загрузчик классов jar-in-jar

Создан загрузчик классов SWTво время выполнения и имеет следующие значения:

  • Классы SWT для вашей платформы
  • Классы вашего приложения

Это означает, что при загрузкеКласс приложения будет загружен загрузчиком классов SWT.Это означает, что, когда ваше приложение ссылается на классы SWT, используется правильный загрузчик классов.

Для рабочего примера этого вы можете скачать и проверить следующий jar: https://github.com/downloads/mchr3k/org.intrace/intrace-ui.jar

РЕДАКТИРОВАТЬ:Файл сборки муравья, который создал intrace-ui.jar, можно увидеть здесь: https://github.com/mchr3k/org.intrace/blob/master/org.intrace/build.xml

В частности, цель "jar" обрабатывает упаковку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...