Tomcat не может выбрать путь к классу из файла манифеста
-
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, как указано выше
Этот Вопрос:
- Я делаю что-то не так?или это Кот ?
- Есть ли другое решение этой проблемы ?
Я уже пробовал \ проверил следующее
- Проверено на наличие символов новой строки в конце файла
- Если я помещу slf4j-api-1.5.2.jar в основную папку lib - ошибка исчезнет - поэтому я знаю, что он не может найти этот конкретный файл jar
- Попробовал относительный, абсолютный путь в файле манифеста
Решение
Единственное место, где 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, который они улучшают.