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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая загрузка Классов в Tomcat-e 
V
    Опции темы
kashka
Дата 22.8.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Проблемма такая: уже во время выполнения программы надо загружать jar файл на сервер и из него соответственно классы.
Если я использую URLClassLoader то Tomcat-овский ClassLoader ети классы не видит.
Может кто знает как ето решается.
PM MAIL   Вверх
Tony
Дата 22.8.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Moment.Если app загружает классы(Class forName("")),то Tomcatovskij class loader и не будет знать о нём.Если я не ошибаюсь, то при загрузке апп сна4ала ищутся классы загружаются апп класс лоадером ,затем если их не найдено,то вызывается Томкат класс лоадер(по цепо4ке идёт загрузка классов).А 4то ты хо4ешь вообще сделать? Коротко написала(бе о4ень понатно).


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
kashka
Дата 22.8.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Вобщем задача такая:
студенты получают задание имплементироварь заданный интерфейс, запаковать свой классы в jar архив и загрузить етот архив на сервер.
После загрузки jar на сервере проводится проверка с junit-тест классами, правильно ли студенты выполнили свою задачу.

Я сачала сделала junit- овскую часть, в еклипсе все работало, после внедрения в томкат перестало. 
Мне нужно както так классы загрузить что бы томкат их тоже знал.

PM MAIL   Вверх
Tony
Дата 22.8.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Например в сервлете вставить Class.forName("moj klasss zapakovannyj v jar");После этого загрузится классы.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
kashka
Дата 23.8.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



В том то и дело что не загружается, те что к моменту старта в WEB-INF/lib/ лежат грузятся без проблем, а классы которые уже во время исполнения аппликации в WEB-INF/lib/ копируются, он не находит smile
PM MAIL   Вверх
Tony
Дата 23.8.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А как нас4ёт classpath ? Правелен?


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
kashka
Дата 23.8.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Да
PM MAIL   Вверх
Tony
Дата 23.8.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Провёл эксперимент.Написал апп.В катором при загрузги станице срабативает Action.В нём делаю
 Class.forName("com.mysql.jdbc.Driver");
 Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test","root","");

jdbc connectior находится в етом же пакете.Происходит java.lang.ClassNotFoundException.
Kak я предпологаю это проишодит из-за не стыковок пакетов.Тоесть мой Аction нахоится в com.acid.tester.actions.В этом пакете находится connector jdbc(ну какбудто его зака4али на сервер) где вызываем класс com.mysql.jdbc.Driver.А должен быть com.acid.tester.actions.com.mysql.jdbc.Driver !
Решить можно так.Когда все студентики загрузят jari(jari uplodatsja v <tvoj_proekt/lib>).Затем прегрузить приложение(перезаписав хмл в tomcat\conf\Catalina\localhost\tvoj_app.xml).Имея базу данных у4еников по о4ереди вызиваешь классы.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
LSD
Дата 23.8.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Tony @  23.8.2006,  20:30 Найти цитируемый пост)
Kak я предпологаю это проишодит из-за не стыковок пакетов.Тоесть мой Аction нахоится в com.acid.tester.actions.В этом пакете находится connector jdbc(ну какбудто его зака4али на сервер) где вызываем класс com.mysql.jdbc.Driver.А должен быть com.acid.tester.actions.com.mysql.jdbc.Driver !

Нет, такого не может быть. Короткое имя класса и директива import существуют только на этапе компиляции. В самих классах фигурируют только полные имена классов. Плюс такого понятия как "относительный пакадж" не существует вообще.


kashka, а ты Thread.setContextClassLoader() делала? И вообще расскажи как ты пыталась грузить классы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kashka
Дата 24.8.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Вобщем так:
я сначала сделала junit часть, т.е. тестировала в еклипсе
Код

Tester t = new Tester();
URLClassLoader loader = new URLClassLoader(new URL[] { new URL("file:" + "jars/EKSWS_JUnit.jar"), 
                                                                   new URL("file:" + "jars/interfaces.jar"), 
                                                                   new URL("file:" + "jars/TestClasses.jar") });
                        
            t.testing(t.getJARClasses(loader, "jars/EKSWS_JUnit.jar", false), t.getJARClasses(loader,"jars/interfaces.jar", true), t.getJARClasses(loader,"jars/TestClasses.jar", false), "out/report.txt");


в Tester я просматривала jar на наличие файлов с расширением .class, потом загружала соответствующие junit тест классы (находятся в TestClasses.jar) все работало.

После попытки подключитьвсе ето дело к моему серверному приложению, я получаю ошибку junit.framework,TestCase .ClassNotFoundException, я сначала думала что ето томкат библиотеку в WEB-INF/lib junit.jar не находит.

Оказывается что то что томкатовским ClassLoader junit.jar  загружает, мой URLClassLoader loader не видит.

Добавлено @ 14:29 
Тогда я попробывола мой .jar файлы положить в WEB-INF/lib и все бы хорошо да вот только два я могу еше до запуска приложения скопировать и там проблем не возникает, а вот третий (который студентческий) копируется туда уже после запуска, и я получаю при попытке 
Код

cls = Class.forName(name);


ошибку ClassNotFoundException

Добавлено @ 14:30 
А  Thread.setContextClassLoader()  я не делала надо попробовать.

Добавлено @ 14:35 
Попробывала не получается smile
PM MAIL   Вверх
Tony
Дата 24.8.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(kashka @ 24.8.2006,  14:24)
Вобщем так:
я сначала сделала junit часть, т.е. тестировала в еклипсе
Код

Tester t = new Tester();
URLClassLoader loader = new URLClassLoader(new URL[] { new URL("file:" + "jars/EKSWS_JUnit.jar"), 
                                                                   new URL("file:" + "jars/interfaces.jar"), 
                                                                   new URL("file:" + "jars/TestClasses.jar") });
                        
            t.testing(t.getJARClasses(loader, "jars/EKSWS_JUnit.jar", false), t.getJARClasses(loader,"jars/interfaces.jar", true), t.getJARClasses(loader,"jars/TestClasses.jar", false), "out/report.txt");


в Tester я просматривала jar на наличие файлов с расширением .class, потом загружала соответствующие junit тест классы (находятся в TestClasses.jar) все работало.

После попытки подключитьвсе ето дело к моему серверному приложению, я получаю ошибку junit.framework,TestCase .ClassNotFoundException, я сначала думала что ето томкат библиотеку в WEB-INF/lib junit.jar не находит.

Оказывается что то что томкатовским ClassLoader junit.jar  загружает, мой URLClassLoader loader не видит.

Добавлено @ 14:29 
Тогда я попробывола мой .jar файлы положить в WEB-INF/lib и все бы хорошо да вот только два я могу еше до запуска приложения скопировать и там проблем не возникает, а вот третий (который студентческий) копируется туда уже после запуска, и я получаю при попытке 
Код

cls = Class.forName(name);


ошибку ClassNotFoundException

Добавлено @ 14:30 
А  Thread.setContextClassLoader()  я не делала надо попробовать.

Добавлено @ 14:35 
Попробывала не получается smile

Что зна4ет не может быть? Я специлано написал тестовие app чтобы это проверить.А насчёт "относительный пакадж" я не писал.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Tony
Дата 24.8.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Так попробуй: this.getClass().getClassLoader().findClass("class_name");


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
kkorsakoff
Дата 26.8.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А там ли лежат jar'ы?
Используется "file:" + "jars/EKSWS_JUnit.jar"
То есть относительно рабочей директории, а она, насколько я понимаю, может меняться, смотря откуда ты будешь запускать томкат.
Может стоит использовать пути относительные к директории веб-приложения через servletContext.getRealPath("/jars/EKSWS_JUnit.jar")?

Просто предположение на глупые граблиsmile
PM MAIL WWW ICQ   Вверх
kashka
Дата 30.8.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

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



Проблему решила smile

Все дело было в том что Tomcat свой ClassLoader от других закрывает (т.е. классы загруженные Tomcat-ом и например URLClassLoader, даже если они одинаковые все равно считаются различными). В моем случае была проблемма с библиотекой junit.
Я ее грузила и вTomcatClassLoader -ом и моим URLClassLoader.

А решение такое: грузить только URLClassLoader-ом а в коде Servlet-a использовать Reflektion.

Вот Код до:
Код

import junit.framework.TestCase;
import junit.framework.TestSuite;
.....
TestSuite suite = new TestSuite();                        
                        try {
                            try {
                                Object object = c.newInstance();
                                // Testklasse instanzeieren
                                
                                for(String mName :  validMethodsName){
                                    Object testC = constr.newInstance(mName, object);
                                    suite.addTest((TestCase)testC);
                                    
                                }
                                
                                (new junit.textui.TestRunner()).run(suite);
....

и после
Код

// импорт болше не нужен
    Class suiteClass        = loader.loadClass("junit.framework.TestSuite");                                
                                Class testRunnerClass    = loader.loadClass("junit.textui.TestRunner");
                                Class junitTestClass    = loader.loadClass("junit.framework.Test");
                                
                                
                                
                                Constructor constructor = suiteClass.getConstructor();
                                Object suite = constructor.newInstance();
                                
                                // Testklasse instanzeieren

                                Object object = c.newInstance();
                                
                                for(String mName :  validMethodsName){
                                    System.out.println(mName);
                                    Object testC = constr.newInstance(mName, object);
                                    
                                    Class classs = testC.getClass().getSuperclass();
                                    
                                    Method m = suiteClass.getMethod("addTest", junitTestClass);
                                    m.invoke(suite, testC);
                                    
                                }
                                
                                Constructor c2 = testRunnerClass.getConstructor();
                                Object testRunner = c2.newInstance();
                                Method m = testRunnerClass.getMethod("run", junitTestClass);
                                m.invoke(testRunner, suite);


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

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

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


 




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


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

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