Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: JAVA Запуска приложения, реализующего динамическую загрузку классов, в терминале  (Прочитано 1403 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн acm22

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Приложение представляет плагино-модульную архитектуру. То есть во время работы выполняется динамическая загрузка классов. Для этого используется пользовательский загрузчик классов расширяющий ClassLoader.

Суть проблемы такова, что в среде Eclipse приложение удается запускать, в то время как в терминале (ubuntu) при использовании следующей строчки кода (где катало "m/" указывает на расположение модулей *.class):
java -jar ModularApp.jar m/

Я получаю следующее сообщение:
(Нажмите, чтобы показать/скрыть)

Вот фрагмент кода, класса пользовательского загрузчика (расширяющего ClassLoader), где возникает ошибка:
(Нажмите, чтобы показать/скрыть)

В чем может крыться проблема? JRE не может вызвать один из загрузчиков классов... ?

P.S. Загрузик реализовывал на основе данной статьи:http://habrahabr.ru/post/104229/

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
acm22, посмотри как(какой командой) эклипс запускает приложение.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн cerh

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Вероятно, из-за того, что Eclipse автоматом добавил классы из папки m(эти классы нваверное в проекте) в classpath, в вашем методе происходит исключение и успешно вызывается super.findClass(className). А все из-за того что, в ваш findClass(String className) className приходит в виде pack1.pack2...ClassName, то есть пакеты разделены точкой и далее m_pathToBin+className+".class" -> m/java.lang.String.class.
сделай хотя бы m_pathToBin+className.replace('.','/')+".class, а далее сами думайте что делать с inner классами.

Оффлайн acm22

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
acm22, посмотри как(какой командой) эклипс запускает приложение.
Как посмотреть? Если Вы про: Выполнить как --> Выполнить Configuration --> вкладка Arguments. То там все поля пустые.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
acm22, можно еще запустить hellow world этот пример в эклипсе, открыть системный монитор, навести на процесс и увидишь команду запуска. Запущен так gedit 1.vala
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн acm22

  • Автор темы
  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
acm22, можно еще запустить hellow world этот пример в эклипсе, открыть системный монитор, навести на процесс и увидишь команду запуска. Запущен так gedit 1.vala

Попробовал. 326 символов. Многовато будет :'D

Пользователь решил продолжить мысль [time]24 Сентябрь 2014, 18:46:04[/time]:
Вероятно, из-за того, что Eclipse автоматом добавил классы из папки m(эти классы нваверное в проекте) в classpath, в вашем методе происходит исключение и успешно вызывается super.findClass(className). А все из-за того что, в ваш findClass(String className) className приходит в виде pack1.pack2...ClassName, то есть пакеты разделены точкой и далее m_pathToBin+className+".class" -> m/java.lang.String.class.
сделай хотя бы m_pathToBin+className.replace('.','/')+".class, а далее сами думайте что делать с inner классами.
Спасибо, справился с загрузкой классов.
Теперь новая проблема, проблема кастомизации. Я так понимаю, что интерфейс CModule и класс CModulePrint были загружены разными загрузчиками. Какие есть идеи?

Пользователь решил продолжить мысль 24 Сентября 2014, 18:47:42:
Лог:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Сентября 2014, 18:48:05 от acm22 »

Оффлайн cerh

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
>>Какие есть идеи?
Загрузать одним класслоадером, а иначе зачем тогда вы свой класслоадер делали.

 

Страница сгенерирована за 0.02 секунд. Запросов: 22.