Проблема развертывания Tomcat с использованием jar-файла вместо классов

StackOverflow https://stackoverflow.com/questions/1091460

  •  11-09-2019
  •  | 
  •  

Вопрос

Мы развертываем файл WAR в Tomcat 5.5, и он отлично работает, если WEB-INF\classes содержит файлы .classes, но если мы переместим файл .jar, содержащий эти .classes, в WEB-INF\lib, мы получим исключение во время выполнения с жалобой на java.lang.NoSuchMethodError, но существующий файл класса в файле .jar содержит класс, и метод завершает работу!

Мы были бы признательны за любую помощь в этом вопросе.

Это было полезно?

Решение

Это могло быть вызвано классовым конфликтом.Убедитесь, что где-то нет более старой версии класса (общая папка Tomcat, WEB-INF/classes, WEB-INF/lib).В этом случае вы практически не можете знать, какой класс Tomcat загрузит.Если он выберет один без метода, произойдет исключение, с которым вы столкнулись.

Другие советы

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

Это демонстративное закрытие класса пожалуйста, взгляните сюда http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

как вы можете видеть, существует более высокий приоритет для классов в разделе WEB-INF/classes по сравнению с WEB-INF/lib .У вас есть два класса с одинаковым именем (и пакетом).Когда один из них находится в папке classes, он имеет более высокий приоритет.когда они оба находятся в папке lib, второй становится первым (банки имеют приоритет, основанный на их алфавитном порядке)

Это может объяснить вашу ситуацию.

Надеюсь, это поможет -- Йонатан

С точки зрения веб-приложения загрузка классов или ресурсов происходит в следующих репозиториях в следующем порядке:

Начальные классы вашей JVM
Классы-загрузчики системных классов (описаны выше)
/WEB-INF/классы вашего веб-приложения
/WEB-INF/lib/*.jar вашего веб-приложения
Общие классы-загрузчики классов (описаны выше)

Места, которые ищет «Общий загрузчик классов», определяются свойством common.loader в $CATALINA_BASE/conf/catalina.properties.Здесь мы включаем/определяем местоположение общего ресурса;
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar

И приведенный выше порядок дает больше понимания проблемы, с которой вы столкнулись.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top