Как Tomcat может найти класс, который не является частью jar-файлов в библиотеках приложений - PullRequest
0 голосов
/ 25 июня 2009

В нашем приложении (апплете) я хочу включить функцию экспорта, если найден один из необходимых jar-файлов. Я не хочу добавлять ссылки на этот jar-апплет, чтобы избежать размера загружаемого файла.

Я использую Class.forName с одним из классов, чтобы проверить, доступно ли конкретное. На локальном компьютере вызов Class.forName перезапускает экземпляр, хотя jar отсутствует ни в одном из путей классов.

Может кто-нибудь объяснить механизм обнаружения класса Tomcat.

Ответы [ 5 ]

1 голос
/ 25 июня 2009

Апплеты запускаются на стороне клиента (внутри браузера пользователя), а не на веб-сервере Tomcat, поэтому это не связано с Tomcat.

Вы хотели бы изучить, как работают загрузчики классов Апплета.

Обычно они пытаются загрузить классы с веб-сервера по тому же URL-адресу, с которого был извлечен апплет. Так что, если апплет в http://www.example.com/Hello/HelloApplet и ему нужен класс foo.bar.MyClass, который попытается загрузить http://www.example.com/Hello/foo/bar/MyClass.class, если он не найден локально.

0 голосов
/ 02 сентября 2009

Причина: одна из других библиотек (jar), на которые ссылались ранее, имела класс, который я искал.

0 голосов
/ 25 июня 2009

Этот вопрос не очень понятен. Tomcat и Applets совершенно разные с точки зрения загрузки классов. Апплеты имеют менеджер безопасности, который предотвращает определенные вещи, такие как загрузка произвольных классов. Они должны загрузить классы с веб-сервера. Веб-сервер не должен быть Tomcat или даже Java; файлы апплета - это просто файлы, обслуживаемые по обычному HTTP.

Что касается Tomcat, эта статья объясняет загрузку классов в версии 6 . В частности, Tomcat использует иерархию загрузчиков классов для поиска классов. Есть несколько известных мест, где автоматически загружаются банки, например $CATALINA_HOME/lib или $CATALINA_HOME/shared/lib. Он также загружает собственные фляги и классы веб-приложения. Загрузчики классов работают следующим образом:

  1. Загрузчик классов начальной загрузки просматривает основные папки классов Java.
  2. Загрузчик системного класса ищет в $ CATALINA_HOME / bin / bootstrap.jar и
  3. $ CATALINA_HOME / бен / кот-juli.jar
  4. Загрузчик классов WebAppX просматривает WEB-INF / classes, а затем WEB-INF / lib
  5. Загрузчик общих классов выглядит в папке $ CATALINA_HOME / lib.
  6. Загрузчик разделяемых классов ищет в $ CATALINA_HOME / shared / classes и $ CATALINA_HOME / shared / lib, если свойство shared.loader установлено в файле conf / catalina.properties.
0 голосов
/ 25 июня 2009

Мне трудно ответить на ваш вопрос. Вы пытаетесь загрузить классы в апплет, если определенное условие времени выполнения выполнено? Я полагаю, что с 6u10 вы можете динамически загружать расширения с DownloadService. Возвращаясь к 1.2, вы можете использовать URLCLassLoader.newInstance, хотя это не так хорошо с точки зрения кэша.

0 голосов
/ 25 июня 2009

Исходя из вашего описания наличия апплета, я не вижу другого выбора, кроме как включить файл 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 каталог).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...