Управлять упорядочением путей к классам в jar-файлах в WEB-INF / lib на Tomcat 5? - PullRequest
8 голосов
/ 07 января 2010

У меня есть устаревшее веб-приложение, работающее в Tomcat 5.0.

В этом веб-приложении есть две банки: WEB-INF / lib , скажем, Foo-2.0.jar и Bar-2.0.jar . Bar-2.0.jar фактически включает в себя Foo-1.0.jar внутри него. Bar также является мертвым проектом, то есть без обновления, без исходного кода, но все же важно для приложения.

Последний выпуск этого приложения требует Foo-2.0.jar для некоторых других вещей. Наличие обоих Foo-1.0.jar и Foo-2.0.jar в пути к классам создает конфликт, в частности тип ошибки ClassDefNotFound , где класс, который был позже добавленный в 2.0 не может быть найден в 1.0 и т. д.

В Eclipse простое решение состоит в том, чтобы щелкнуть правой кнопкой мыши на Project , щелкнуть Свойства > Java Built Path > Заказ и экспорт и для перемещения Foo-2.0.jar выше Bar-2.0.jar , поэтому он разрешается первым.

Как можно выполнить этот тип упорядочения путей к классам для jar-файлов в WEB-INF / lib в Tomcat?

Ответы [ 7 ]

33 голосов
/ 07 января 2010

Приоритет загрузки классов Tomcat 5 для веб-приложений примерно такой: сначала начальная загрузка / система (JRE/lib, затем внутренние классы Tomcat), затем библиотеки веб-приложений (сначала WEB-INF/classes, затем WEB-INF/lib ), затем общие библиотеки (сначала Tomcat/common, затем Tomcat/lib) и, наконец, общие для веб-приложений библиотеки (Tomcat/shared).

Таким образом, чтобы загрузить Foo-2.0.jar до Bar-2.0.jar, лучшее, что вы можете сделать, это переместиться Bar-2.0.jar с WEB-INF/lib на Tomcat/common или Tomcat/shared.

JAR загружены не в алфавитном порядке их имени. По крайней мере, нет спецификации, которая говорит это. Переименование их для изменения алфавитного порядка имен файлов не имеет смысла.

4 голосов
/ 07 января 2010

Полоса Foo-1.0.jar из Bar-2.0.jar На самом деле, это просто проблема в ожидании того, что произойдет как для разработки (необходимо придумать среду разработки), так и для развертывания.

3 голосов
/ 07 января 2010

Поместите Foo-1.0.jar в $ CATALINE_HOME / common / endorsed (или в любое другое место, куда он будет загружен после Foo-2.0.jar).

1 голос
/ 07 января 2010

Нет, так как эта функция недоступна в Tomcat. Если и Foo-1.0.jar, и Foo-2.0.jar необходимы в пути к классам одновременно, вам потребуется некоторая серьезная реорганизация пути к классам.

Если Bar-2.0 может работать с Foo-2.0, то лучше всего было бы перестроить Bar-2.0 самостоятельно без встроенного в него файла Foo-1.0.jar.

0 голосов
/ 26 марта 2018

Чтобы иметь Foo-2.0.jar до Bar-2.0.jar, обновите Bar-2.0.jar содержимым Foo-2.0.jar (переписать уже содержащий .class) и удалите Foo-2.0.jar из войны.

-cp A.jar: B.jar приводит к тому, что содержание A.jar похоже на слой над B.jar.Таким образом, вы получаете тот же эффект, переписывая содержимое B.jar с содержимым A.jar.

0 голосов
/ 07 января 2010

Это немного глупо, но может сработать.Измените имя Foo-2.0.jar так, чтобы оно было в алфавитном порядке впереди Bar-2.0.jar, скажем AFoo-2.0.jar.

0 голосов
/ 07 января 2010

Возможно установить Class-Path на главном фестивале банки. http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html Я не могу пообещать, что это решит проблему, но стоит попробовать.

...