Архиватор Maven , используемый плагином Maven WAR , предоставляет средства для генерации записей Class-Path в манифесте WAR, но, к сожалению, архиватор принимает все или ничего подход. После передачи addClassPath=true
в конфигурацию архива архиватор помещает записи Class-Path для всех обязательных и необязательных зависимостей WAR в манифест.
Однако, некоторые записи просто не принадлежат там. Записи пути к классу используются для обозначения «Скачать расширения» или ссылок на JAR external на WAR. JAR, расположенные в WEB-INF/lib
, должны , а не , поэтому в манифесте WAR должны быть записи Class-Path. Плагин Maven's War нарушает это правило, когда вы устанавливаете addClassPath=true
в архиваторе.
Более того, когда вы передаете addClassPath=true
архиватору Maven, он присваивает всем записям Class-Path один и тот же префикс каталога - независимо от того, где находятся зависимости в EAR. Это вызывает проблемы, когда необязательные и требуемые зависимости находятся в разных местах, таких как корневой каталог EAR, EAR lib
и WAR WEB-INF/lib
.
Естественно, когда кто-то развертывает EAR, чей манифест WAR содержит вышеупомянутые ошибки, JBoss выдает предупреждения, если загрузчик класса WAR может в конечном итоге найти зависимость (JAR, расположенные в WEB-INF/lib
) или ошибки, если префикс пути к классу неверен (например, EJB JAR или зависимость в каталоге EAR lib
).
Поэтому, если ваша WAR, как и моя, зависит от модуля EJB, расположенного в корне EAR, и любого числа зависимостей, находящихся в WEB-INF/lib
, архиватор Maven сгенерирует записи Class-Path для всех зависимости и все они будут иметь одинаковый префикс независимо от их местоположения в EAR.
Не хорошо.
Проблема будет несколько улучшена, если архиватор предоставит средство для исключения записей пути к классу JAR, расположенных в WEB-INF. Но это не так.
Вот сводка результатов для каждого параметра зависимости, когда используется addClassPath=true
:
Setting Generate Copy JAR into
Class-Path WEB-INF/lib
Entry
1. <scope>provided</scope> NO NO
2. <optional>true</optional> YES NO
3. (no option -- default) YES YES
4. ????? NO YES
Требуется покрытие для ситуации # 4, выше: не создавайте запись Class-Path и, да, скопируйте JAR в WEB-INF/lib
. Архиватор Maven должен реализовать это поведение по умолчанию.
Лучшее решение, которое я могу придумать, - это использовать грубую силу и отключить автоматическую генерацию записей путей к классам в архиваторе Maven. Вместо этого я явно создаю запись Class-Path для модуля EJB в манифесте WAR, используя опцию архиватора manifestEntries
. Способ сделать это состоит в том, чтобы удалить следующее из Patrac-web/pom.xml
:
<manifest>
<addClasspath>true</addClasspath>
</manifest>
и замените его следующим:
<manifestEntries>
<Class-Path>Patrac-ejb-${project.version}.jar</Class-Path>
</manifestEntries>
При использовании этой конфигурации явно создается только одна запись Class-Path для модуля EJB.