Загрузчики классов и обмен файлами .jar с Apache Tomcat - PullRequest
2 голосов
/ 19 июня 2010

Если у меня есть классы, которые нужно разделить между моим веб-приложением и Tomcat (например, пользовательская область и принципал), куда должен идти файл .jar, содержащий эти классы?банка в $ {CATALINA_HOME} / lib.Этот результат является ClassCastException при назначении ссылок из классов того же типа.Вот пример:

MyCustomPrincipal principal = (MyCustomPrincipal)FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();

Приведенный выше метод генерирует исключение ClassCastException.Метод возвращает фактический тип MyCustomPrincipal (так как это то, что моя пользовательская область дала Tomcat, когда он выполнял аутентификацию), который, очевидно, был создан другим загрузчиком классов.Как это исправить, чтобы и Tomcat, и мое веб-приложение могли использовать MyCustomPrincipal?

http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

Любая помощь приветствуется.Andrew

1 Ответ

4 голосов
/ 19 июня 2010

Похоже, у вас загружено 2 копии, одна в tomcat и однажды в ваших банках WEB-INF / lib или другом пути к классу вашего развернутого приложения.

Причина, по которой вы получаете исключение classpath, заключается в том, чтоВОЙНА ищет классы.Вопреки обычным правилам Java, война сначала ищет внутри войны класс и только затем передает запрос родительскому загрузчику классов.

Идентификация класса зависит от загрузчика классов и того же класса, загруженного в 1 загрузчик классовсгенерирует исключение classcast, когда оно преобразуется в другой загрузчик классов.

Решение состоит в том, чтобы убедиться, что война не содержит классов, которые должны быть предоставлены контейнером.Если вы используете maven, вы можете пометить эти зависимости как «предоставленные», если вы используете ant, вам придется разделить ваш список пути к классам на 2 и скомпилировать оба, но использовать только те, которые вам нужны для построения войны.

...