Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая загрузка, ... ну не врубаюсь я :) 
V
    Опции темы
maxlab
Дата 26.12.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



С наступающим!
После сборки приложения получаем такую иерархию
/<Папка приложения>
 |-/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 Выручайте

--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
math64
Дата 26.12.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Наклько я понимаю, класс у тебя forms.Application, а не b2009.forms.Application, а путь для загрузчика классов должен быть b2009/classes/.
PM   Вверх
maxlab
Дата 26.12.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Цитата(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)


--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
MisterCleric
Дата 26.12.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Цитата

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


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

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

Код

package и т.д.;



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
ecologist
Дата 26.12.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Что-то я тоже не очень догоняю - структура по идее должна быть такой:

Код

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


Это сообщение отредактировал(а) ecologist - 26.12.2008, 12:56
PM MAIL   Вверх
maxlab
Дата 26.12.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Цитата(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 не входит. 

Это сообщение отредактировал(а) maxlab - 26.12.2008, 13:35

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  screen1.jpg 26,43 Kb
--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
ecologist
Дата 26.12.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



А нафига такие сложности ?
PM MAIL   Вверх
Vurn
Дата 26.12.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.5.2007

Репутация: 2
Всего: 3



Автор, от вас требуется привести заголовок Application, его package секцию.
PM MAIL   Вверх
ecologist
Дата 26.12.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Лучше бы причину такого решения smile

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

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

PM MAIL   Вверх
Vurn
Дата 26.12.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.5.2007

Репутация: 2
Всего: 3



Код

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!");
    }
}


Работает.
PM MAIL   Вверх
maxlab
Дата 26.12.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



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

package b2009.forms
--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
MisterCleric
Дата 26.12.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Цитата

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 секунды
считай, что пакеты и подпакеты - это тоже папки.
Значит тебе надо найти отправную папку и из нее лодить


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
maxlab
Дата 26.12.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Цитата(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 секунды
Работает! Спасибо всем! 
--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
MisterCleric
Дата 26.12.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Ну вот и отлично!
Хоть в чужом коде ошибки находишь...

to maxlab

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


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
maxlab
Дата 26.12.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



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

to maxlab

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

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

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

Это сообщение отредактировал(а) maxlab - 26.12.2008, 15:28
--------------------
Удивительное рядом... но оно запрещено!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0956 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.