Как Tomcat может найти класс, который не входит ни в один из jar-файлов в библиотеках приложений
В нашем приложении (апплете) я хочу включить функцию экспорта, если найден один из необходимых jar-файлов. Я не хочу добавлять этот jar апплет ссылки, чтобы избежать размера загрузки.
Я использую Class.forName с одним из классов, чтобы проверить, доступен ли конкретный. На локальном компьютере вызов Class.forName перезапускает экземпляр, хотя jar отсутствует ни в одном из путей классов.
Кто-нибудь может объяснить механизм обнаружения класса Tomcat.
5 ответов
Апплеты запускаются на стороне клиента (внутри браузера пользователя), а не на веб-сервере Tomcat, так что это не связано с Tomcat.
Вы хотели бы исследовать, как работают загрузчики классов Апплета.
Обычно они пытаются загрузить классы с веб-сервера по тому же URL-адресу, с которого был извлечен апплет. Поэтому, если апплет находится по адресу http://www.example.com/Hello/HelloApplet и ему нужен класс foo.bar.MyClass, он попытается загрузить http://www.example.com/Hello/foo/bar/MyClass.class если он не найден локально.
Причина: одна из других библиотек (jar), на которые ссылались ранее, имела класс, который я искал.
Мне тяжело после твоего вопроса. Вы пытаетесь загрузить классы в апплет, если определенное условие времени выполнения выполнено? С 6u10, я думаю, вы можете динамически загружать расширения с DownloadService
, Возвращаясь к 1.2, вы можете использовать URLCLassLoader.newInstance
, хотя это не будет так хорошо на стороне кэша вещей.
Исходя из вашего описания наличия апплета, я не вижу другого выбора, кроме как включить файл jar в тег апплета, так как апплет работает на стороне клиента.
Вы можете установить заголовки кэша HTTP для файлов JAR, чтобы позволить клиентскому браузеру их кэшировать, поэтому вы платите только за загрузку только один раз.
Для часто меняющихся jar-файлов включите номер версии в имя jar-файла, чтобы избежать проблем кэширования на стороне клиента с одинаковыми, но содержательно разными jar-файлами.
Редактировать: Хотя вопрос в том, как tomcat обнаруживает банки, я думаю, что основная причина проблемы в другом.
В Tomcat 6 на стороне сервера Tomcat ищет в ваших файлах jar каталоги $TOMCAT_HOME/lib и WEB-INF/lib. Если вы добавляете или удаляете файлы там, вам обычно нужно перезапустить весь экземпляр Tomcat.
Edit2:
Ваш опыт поиска файла jar может быть вызван тем, что вы запускаете HTML-страницу из того же каталога, где находится ваше веб-приложение, или у вас есть файл JAR в обычном месте или в общем пути к классам (например, в каталоге JRE/lib/ext).
Этот вопрос не очень понятен. Tomcat и Applets совершенно разные с точки зрения загрузки классов. Апплеты имеют менеджер безопасности, который предотвращает определенные вещи, такие как загрузка произвольных классов. Они должны загрузить классы с веб-сервера. Веб-сервер не должен быть Tomcat или даже Java; файлы апплета - это просто файлы, обслуживаемые по обычному HTTP.
Что касается Tomcat, в этой статье описывается загрузка классов в версии 6. В частности, Tomcat использует иерархию загрузчиков классов для поиска классов. Есть несколько известных мест, где автоматически загружаются банки, такие как $CATALINA_HOME/lib
или же $CATALINA_HOME/shared/lib
, Он также загружает собственные фляги и классы веб-приложения. Загрузчики классов работают следующим образом:
- Загрузчик классов начальной загрузки просматривает основные папки классов Java.
- Загрузчик системного класса выглядит в $CATALINA_HOME/bin/bootstrap.jar и
- $ CATALINA_HOME / бен / кот-juli.jar
- Загрузчик классов WebAppX просматривает WEB-INF/classes, а затем WEB-INF/lib
- Загрузчик общих классов выглядит в папке $CATALINA_HOME/lib.
- Загрузчик разделяемых классов ищет в $CATALINA_HOME/shared/classes и $CATALINA_HOME/shared/lib, если свойство shared.loader установлено в файле conf / catalina.properties.