2011-08-01 3 views
3

У меня есть серия зависимых проектов Java. Я хотел бы упаковать их вместе в один JAR-файл, который будет использоваться в моем WAR-файле. Эти проекты зависят от большого количества внешних библиотек и проектов, таких как log4j, apache-commons и т. Д.Упаковка файла JAR в файле WAR

Я выбираю все проекты в Eclipse и экспортирую как JAR-файл, а затем копирую JAR-файл в my/WEB-INF/lib моей WAR, затем разверните мое приложение. У меня есть следующие проблемы:

  1. ClassNotFoundException. Веб-приложение не может найти библиотеки, упакованные в мой JAR-файл. Я решил эту проблему, переместив все зависимые библиотеки в папку/WEB-INF/lib и добавив записи в класс MANIFEST.MF JAR, очень болезненный процесс.

  2. Классы в JAR-файле не могут найти файлы свойств, упакованные внутри JAR. Как решить эту проблему?

Есть ли стандартное решение этих проблем? Благодарю.

+1

* Почему вы хотите, чтобы все ваши зависимости находились в одной банке? Что не так, просто поместив все их в 'WEB-INF/lib'? (Также: вам не нужны записи Class-Path, webapp автоматически получает доступ ко всем файлам jar в 'WEB-INF/lib'). –

+0

Я бы предпочел сохранить мой JAR-файл автономным и распространяемым, вместо того, чтобы взорвать ненужные зависимости в моем WEB-INF/lib –

+1

Они не лишние, не так ли? Если вы хотите использовать самодостаточную банку, не используйте внешние библиотеки. –

ответ

4

Я бы рекомендовал использовать то, что делает автоматическое управление зависимостями для вас. Если у вас уже есть муравейник для вашего скрипта сборки, плющ - отличное решение. Если у вас нет сценария сборки на месте, maven, возможно, стоит изучить.

Управление зависимостями автоматически вытягивает транзитные зависимости для зависимостей (банок), которые вы используете напрямую.

0

Стандартное решение этой проблемы заключается в том, что все файлы jar вы зависите в папке WEB-INF/lib. То, что вы ищете, является нестандартным решением.

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

Смежные вопросы