Tomcat не может выбрать путь к классу из файла манифеста - PullRequest
1 голос
/ 09 апреля 2009

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

Проблема:

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

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

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

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

И библиотека WebApps \ MyApp \ WEB-INF \ Lib

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

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

Archiver-Version: Plexus Archiver Создано: 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 будет загружен автоматически вместе с hibernate Но это не работает ... Tomcat не может найти файлы JAR, указанные в .MF, как указано выше

Вопрос:

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

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

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

Ответы [ 4 ]

0 голосов
/ 09 апреля 2009

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

Если вам нужны разные версии JAR для разных частей вашего приложения, вы звучите как человек, который действительно нуждается в OSGi . Это проблема, которая была изобретена для решения.

Существует двух конкурирующих JSR , но я не знаю каких-либо реализаций для предложения модуля Sun.

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

0 голосов
/ 09 апреля 2009

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

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

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

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

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

0 голосов
/ 09 апреля 2009

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

0 голосов
/ 09 апреля 2009

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


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

...