Tomcat не может выбрать путь к классу из файла манифеста

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

  •  06-09-2019
  •  | 
  •  

Вопрос

Версия Tomcat: 5.0.28 JDK:1.5.0.14

Проблема:

Я использую как hibernate, так и struts У нас не самая последняя и лучшая версия для этих библиотек Итак, обеим нужна другая версия библиотеки apache-commons.

Решение, которое я имею в виду:

Используйте файл манифеста и укажите другую версию apache-commons для каждого

Мое веб-приложение развернуто как webapps \ myapp

И библиотека такая: webapps\myapp\ WEB-INF\lib

Я изменил Manifest.mf в hibernate3.jar следующим образом

Манифест-Версия:1.0

Архиватор-Версия:Архиватор сплетений Создан:1.5.0_15-b04 (Sun> Microsystems Inc.) Путь к классу:hibernatelib/slf4j-api-1.5.2.jar

и поместите slf4j-api-1.5.2.jar в webapps\myapp\WEB-INF\lib\hibernatelib

Теперь я бы ожидал, что slf4j-api-1.5.2.jar будет автоматически загружено вместе с переходом в спящий режим Но это не работает...Tomcat не может найти файлы jar, указанные в .MF, как указано выше

Этот Вопрос:

  1. Я делаю что-то не так?или это Кот ?
  2. Есть ли другое решение этой проблемы ?

Я уже пробовал \ проверил следующее

  1. Проверено на наличие символов новой строки в конце файла
  2. Если я помещу slf4j-api-1.5.2.jar в основную папку lib - ошибка исчезнет - поэтому я знаю, что он не может найти этот конкретный файл jar
  3. Попробовал относительный, абсолютный путь в файле манифеста
Это было полезно?

Решение

Единственное место, где Class-Path атрибут в манифесте используется, когда jar содержащий манифест вызывается как исполняемый файл jar с использованием ("java -jar theFile.jar").

Некоторые контейнеры сервлетов, похоже, поддерживают это, но в соответствии к этому сообщению из списка рассылки (Извините, не смог так быстро найти ничего более авторитетного) это также не указано в спецификации.

Насколько я понимаю, веб-приложения обычно загружают свои классы с помощью одного загрузчика классов."Правильное" решение этой проблемы зависимости потребовало бы, по крайней мере, 2 разных загрузчика классов.

Хакерским решением могло бы быть использование джарджар или аналогичный инструмент для упаковки различных библиотек вместе с их соответствующими зависимостями.

Итак, вы бы произвели один jar содержащий Hibernate вместе с его библиотекой apache-commons и другим jar содержащий struts вместе с его библиотекой apache-commons.Каждая копия библиотеки apache-commons будет перемещена в разные пакеты (возможно hibernate.org.apache.* и struts.org.apache.*) чтобы решить проблему с разными версиями classe.

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

Вы проверили правильность каких-либо разрешений?Также может быть идея убедиться, что после этой последней строки пути к классу есть новая строка, которая помогла мне ранее сегодня!


Обновить:если Tomcat не поддерживает подобные объявления classpath, единственное, что приходит на ум, - это возиться с загрузчиками классов.Лично я бы не стал этого делать - на этом пути есть целый мир потенциальных проблем, и вам, вероятно, будет легче просто обновиться.Извините, я не могу придумать лучшего ответа!

Вы пробовали последнюю, самую лучшую версию Tomcat, чтобы проверить, сохраняется ли проблема по-прежнему?Tomcat 6 уже несколько лет, не говоря уже о 5.5 или 5.0...

Я не верю, что ты можешь это сделать.Tomcat не просматривает манифесты JAR для решения проблем с CLASSPATH.Он использует свою собственную иерархию загрузчиков классов, чтобы найти то, что ему нужно, используя то, что он называет CLASSPATH .

Если вам нужны разные версии JAR для разных частей вашего приложения, вы похожи на человека, которому действительно нужны OSGi ( ОСГи ).Вот для решения этой проблемы и была придумана ис.

Есть такие два конкурирующих JSR есть, но я не знаю ни о каких реализациях предложения Sun module.

Единственный известный мне сервер приложений, который позволит вам это сделать, - это Сервер DM Spring's DM server.Это форк Tomcat, который они улучшают.

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