Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Динамическая загрузка


Автор: maxlab 26.12.2008, 12:05
С наступающим!
После сборки приложения получаем такую иерархию
/<Папка приложения>
 |-/lib
 |  |-<Здесь библиотеки>
 |-Loader.jar - это загрузчик. Запуск Loader.Start

После отработки загрузчика внутри этой иерархии появляется еще одна папка. Выглядит это так
/<Папка приложения>
 |-/lib
 |  |-<Здесь библиотеки>
 |-/b2009 
 |  |-/classes
 |  |-/forms
 |  |  |-Application.class - Это то что нужно запустить
 |  |-/reports
 |  |-/dialogs
 |-Loader.jar - это загрузчик. Запуск Loader.Start

Никак не получается загрузить и выполнить Application. Делаю так
Код

            URL classpath = new File("b2009/").toURI().toURL();
            URLClassLoader loader  = URLClassLoader.newInstance(new URL[] {classpath});
            Class<?> Application = Class.forName("b2009.forms.Application",true,loader);
            Method m = Application.getMethod("DoIt");
            Object oApp = Application.newInstance();
            m.invoke(oApp);

Получаю эксепшен
Код

run:
26.12.2008 11:45:24 Loader.Start main
SEVERE: null
java.lang.ClassNotFoundException: b2009.forms.Application
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:592)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at Loader.Start.main(Start.java:134)

Форум читал... пробовал по разному. Ну не догоняю smile Выручайте

Автор: math64 26.12.2008, 12:21
Наклько я понимаю, класс у тебя forms.Application, а не b2009.forms.Application, а путь для загрузчика классов должен быть b2009/classes/.

Автор: maxlab 26.12.2008, 12:33
Цитата(math64 @ 26.12.2008,  12:21)
Наклько я понимаю, класс у тебя forms.Application, а не b2009.forms.Application, а путь для загрузчика классов должен быть b2009/classes/.

Нет... b2009/classes - это составная часть проекта b2009. Там лежат невизуальные, вспомогательные классы к этому проекту. Следуя Вашей логике переписал несколько строк кода
Код

            URL classpath = new File("b2009/forms/").toURI().toURL();
            URLClassLoader loader  = URLClassLoader.newInstance(new URL[] {classpath});
            Class<?> Application = Class.forName("Application",true,loader);
            Method m = Application.getMethod("DoIt");
            Object oApp = Application.newInstance();
            m.invoke(oApp);

Теперь другая ошибка
Код

run:
Exception in thread "main" java.lang.NoClassDefFoundError: Application (wrong name: b2009/forms/Application)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:592)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at Loader.Start.main(Start.java:134)


Автор: MisterCleric 26.12.2008, 12:51
Цитата

Class.forName("Application",true,loader);


А точно данный класс не лежит ни в каком пакете?

может там есть все-таки что типа в первой строке этого класса ?

Код

package и т.д.;

Автор: ecologist 26.12.2008, 12:55
Что-то я тоже не очень догоняю - структура по идее должна быть такой:

Код

/<Приложение>
   /WEB-INF
      /classes
         /b2009 
            /forms
            /reports
            /dialogs
      /lib
      -web.xml

Автор: maxlab 26.12.2008, 12:57
Цитата(MisterCleric @ 26.12.2008,  12:51)
Цитата

Class.forName("Application",true,loader);


А точно данный класс не лежит ни в каком пакете?

может там есть все-таки что типа в первой строке этого класса ?

Код

package и т.д.;

b2009 - это просто скомпилированный проект. В jar его не упаковывал. Сам по себе он запускается стандартным способом. В Application есть метод main
Но надо запустить через загрузчик smile

Добавлено @ 13:02
Цитата(ecologist @ 26.12.2008,  12:55)
Что-то я тоже не очень догоняю - структура по идее должна быть такой:

Код

/<Приложение>
   /WEB-INF
      /classes
         /b2009 
            /forms
            /reports
            /dialogs
      /lib
      -web.xml

Структура каталогов - как я нарисовал в 1 посте. b2009 - это отдельное приложение(проект) который в систему пакетов Loader не входит. 

Автор: ecologist 26.12.2008, 13:48
А нафига такие сложности ?

Автор: Vurn 26.12.2008, 14:28
Автор, от вас требуется привести заголовок Application, его package секцию.

Автор: ecologist 26.12.2008, 14:33
Лучше бы причину такого решения smile

Как-то читал книжку и там примерчик был занятный:

Один студент спрашивает: 
- Как по-английски будет "У" ?
- В смысле "У" ?
- Ну я хочу перевести на английский - У меня нет этой книги.

Автор: Vurn 26.12.2008, 14:38
Код

import java.net.URLClassLoader;
import java.net.URL;
import java.net.MalformedURLException;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Starter {
    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file://b2009/forms")});
        Class app = ucl.loadClass("Application");
        Method m = app.getMethod("main", String[].class);
        m.invoke(null, new Object[]{args});
    }
}


Код

public class Application {
    public static void main(String[] args) {
        System.out.println("I'm running!");
    }
}


Работает.

Автор: maxlab 26.12.2008, 14:40
Цитата(Vurn @ 26.12.2008,  14:28)
Автор, от вас требуется привести заголовок Application, его package секцию.

package b2009.forms

Автор: MisterCleric 26.12.2008, 15:01
Цитата

package b2009.forms 


ну вот.
Тогда надо лодить так:
Код

 URL classpath = new File("/").toURI().toURL();
            URLClassLoader loader  = URLClassLoader.newInstance(new URL[] {classpath});
            Class<?> Application = Class.forName("b2009.forms.Application",true,loader);


Добавлено через 1 минуту и 22 секунды
считай, что пакеты и подпакеты - это тоже папки.
Значит тебе надо найти отправную папку и из нее лодить

Автор: maxlab 26.12.2008, 15:16
Цитата(MisterCleric @ 26.12.2008,  15:01)
Цитата

package b2009.forms 


ну вот.
Тогда надо лодить так:
Код

 URL classpath = new File("/").toURI().toURL();
            URLClassLoader loader  = URLClassLoader.newInstance(new URL[] {classpath});
            Class<?> Application = Class.forName("b2009.forms.Application",true,loader);


Добавлено @ 15:03
считай, что пакеты и подпакеты - это тоже папки.
Значит тебе надо найти отправную папку и из нее лодить

Не-а... не так
А вот как!
Код

 URL classpath = new File("").toURI().toURL(); // <- Вот загвоздка!!!
 URLClassLoader loader  = URLClassLoader.newInstance(new URL[] {classpath});
 Class<?> Application = Class.forName("b2009.forms.Application",true,loader);


Добавлено через 52 секунды
Работает! Спасибо всем! 

Автор: MisterCleric 26.12.2008, 15:23
Ну вот и отлично!
Хоть в чужом коде ошибки находишь...

to maxlab

Благодарность учили выражать? Ну... плюсиком

Автор: maxlab 26.12.2008, 15:26
Цитата(MisterCleric @ 26.12.2008,  15:23)
Ну вот и отлично!
Хоть в чужом коде ошибки находишь...

to maxlab

Благодарность учили выражать? Ну... плюсиком

С удовольствием! А как? Что нажимать надо?

Уже разобрался...

Автор: MisterCleric 26.12.2008, 15:48
 smile Удачи тебе!
Заходи по чаще: тоже часто помощь нужна, а спросить, как здесь больше негде

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)