| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Работа с сетью > Динамическая загрузка Классов в Tomcat-e |
| Автор: kashka 22.8.2006, 15:50 |
| Проблемма такая: уже во время выполнения программы надо загружать jar файл на сервер и из него соответственно классы. Если я использую URLClassLoader то Tomcat-овский ClassLoader ети классы не видит. Может кто знает как ето решается. |
| Автор: Tony 22.8.2006, 16:26 |
| Moment.Если app загружает классы(Class forName("")),то Tomcatovskij class loader и не будет знать о нём.Если я не ошибаюсь, то при загрузке апп сна4ала ищутся классы загружаются апп класс лоадером ,затем если их не найдено,то вызывается Томкат класс лоадер(по цепо4ке идёт загрузка классов).А 4то ты хо4ешь вообще сделать? Коротко написала(бе о4ень понатно). |
| Автор: kashka 22.8.2006, 17:10 |
| Вобщем задача такая: студенты получают задание имплементироварь заданный интерфейс, запаковать свой классы в jar архив и загрузить етот архив на сервер. После загрузки jar на сервере проводится проверка с junit-тест классами, правильно ли студенты выполнили свою задачу. Я сачала сделала junit- овскую часть, в еклипсе все работало, после внедрения в томкат перестало. Мне нужно както так классы загрузить что бы томкат их тоже знал. |
| Автор: Tony 22.8.2006, 19:03 |
| Например в сервлете вставить Class.forName("moj klasss zapakovannyj v jar");После этого загрузится классы. |
| Автор: kashka 23.8.2006, 00:25 |
| В том то и дело что не загружается, те что к моменту старта в WEB-INF/lib/ лежат грузятся без проблем, а классы которые уже во время исполнения аппликации в WEB-INF/lib/ копируются, он не находит |
| Автор: Tony 23.8.2006, 16:04 |
| А как нас4ёт classpath ? Правелен? |
| Автор: kashka 23.8.2006, 17:00 |
| Да |
| Автор: Tony 23.8.2006, 19:30 |
| Провёл эксперимент.Написал апп.В катором при загрузги станице срабативает 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ереди вызиваешь классы. |
| Автор: kashka 24.8.2006, 14:24 | ||||
| Вобщем так: я сначала сделала junit часть, т.е. тестировала в еклипсе
в 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 и все бы хорошо да вот только два я могу еше до запуска приложения скопировать и там проблем не возникает, а вот третий (который студентческий) копируется туда уже после запуска, и я получаю при попытке
ошибку ClassNotFoundException Добавлено @ 14:30 А Thread.setContextClassLoader() я не делала надо попробовать. Добавлено @ 14:35 Попробывала не получается |
| Автор: Tony 24.8.2006, 16:24 | ||||||
Что зна4ет не может быть? Я специлано написал тестовие app чтобы это проверить.А насчёт "относительный пакадж" я не писал. |
| Автор: Tony 24.8.2006, 20:48 |
| Так попробуй: this.getClass().getClassLoader().findClass("class_name"); |
| Автор: kkorsakoff 26.8.2006, 18:20 |
| А там ли лежат jar'ы? Используется "file:" + "jars/EKSWS_JUnit.jar" То есть относительно рабочей директории, а она, насколько я понимаю, может меняться, смотря откуда ты будешь запускать томкат. Может стоит использовать пути относительные к директории веб-приложения через servletContext.getRealPath("/jars/EKSWS_JUnit.jar")? Просто предположение на глупые грабли |
| Автор: kashka 30.8.2006, 12:51 | ||||
| Проблему решила Все дело было в том что Tomcat свой ClassLoader от других закрывает (т.е. классы загруженные Tomcat-ом и например URLClassLoader, даже если они одинаковые все равно считаются различными). В моем случае была проблемма с библиотекой junit. Я ее грузила и вTomcatClassLoader -ом и моим URLClassLoader. А решение такое: грузить только URLClassLoader-ом а в коде Servlet-a использовать Reflektion. Вот Код до:
и после
|