2009-04-08 7 views
1

Tomcat Версия: 5.0.28 JDK: 1.5.0.14Tomcat не может выбрать класс-путь из манифеста файла

Проблема:

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

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

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

Мой веб-приложение развертывается в WebApps \ MyApp

И lib - webapps \ myapp \ WEB-INF \ lib

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

Manifest-Version: 1,0

Archiver-Version: Сплетение Archiver Создано-By: 1.5.0_15-b04 (ВС> Microsystems Inc.) Class-Path: hibernatelib/SLF4J-апи-1,5 .2.jar

и поставить SLF4J-апи-1.5.2.jar в WebApps \ MyApp \ WEB-INF \ Lib \ hibernatelib

Теперь я хотел бы ожидать, что SLF4J-апи-1,5. 2.jar будет загружаться автоматически вместе с гибернациейНо ее не работает ... Tomcat не в состоянии найти банку файлы, указанные в .mf, как описано выше

Вопрос:

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

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

  1. Проверены для символов новой строки в конце файла
  2. Если я ставлю SLF4J-Апи-1.5.2.jar в основной Lib папке- ошибка идет away-, так что я знаю его не удалось найти конкретную банку файл
  3. Пробовал относительный, абсолютный путь в файле манифеста

ответ

0

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

Некоторые контейнеры сервлетов, похоже, поддерживают его, но в соответствии с to this mailing list post (Извините, не удалось найти что-либо более авторитарное так быстро), это также не указано в спецификации.

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

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

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

+0

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

+0

Kool Это помогает Я попытался ответить, но не хватило повторений :) –

+0

Без проблем, рад, что я мог бы помочь. –

0

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


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

+0

Да, я проверил новую линию. Какое разрешение необходимо проверить? –

+0

Просто проверяйте спецификацию @ http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html. Я думаю, вы должны убедиться, что после каждой записи есть новая строка, это в грамматике. – Brabster

+0

Извините, возможно, не разрешений. Я видел несколько ссылок вокруг, которые говорят, что Tomcat проигнорирует материал класса, объявленный в файлах манифеста в WEB-IN/lib, - ничего официально, хотя, извините. – Brabster

0

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

+0

Пока нет. Думаю, я могу попробовать и посмотреть, не исчезла ли проблема. Но это не поможет мне. Модернизация Tomcat сейчас не вариант. –

0

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

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

Есть two competing JSRs, но я не знаю никаких реализаций для предложения модуля Sun.

Один сервер приложений, который я знаю об этом, позволит вам сделать это: Spring's DM server. Это развилка Tomcat, которую они усиливают.