Как правильно настроить путь к классам манифеста в maven-war-plugin - PullRequest
15 голосов
/ 11 февраля 2012

Я использовал maven-ear-plugin с maven-war-plugin и maven-ejb-plugin для успешного развертывания и запуска приложения, упакованного как EAR, в Jboss AS7.

.
|-- META-INF
|   |-- application.xml
|   |-- MANIFEST.MF
|   `-- maven
|       `-- com.patrac
|           `-- Patrac-ear
|               |-- pom.properties
|               `-- pom.xml
|-- Patrac-ejb-1.0-SNAPSHOT.jar
`-- Patrac-web-1.0-SNAPSHOT.war

Inкаталоги исходного кода приложения, poms расположены следующим образом:

.
|
|-- Patrac-ear
|   `-- pom.xml
|-- Patrac-ejb
|  `-- pom.xml
|-- Patrac-web
|   `-- pom.xml
`-- pom.xml

Я не могу понять, как остановить несколько раздражающих предупреждений при развертывании приложения:

12:32:03,958 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-ui-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war"  does not point to a valid jar for a Class-Path reference.
12:32:03,970 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war"  does not point to a valid jar for a Class-Path reference.
12:32:03,984 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war"  does not point to a valid jar for a Class-Path reference.
12:32:03,989 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-impl-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war"  does not point to a valid jar for a Class-Path reference.

Patrac-web-1.0-SNAPSHOT.war! META-INF / MANIFEST.MF выглядит следующим образом:

Manifest-Version: 1.0
Built-By: pgarner
Build-Jdk: 1.7.0_02
Class-Path: Patrac-ejb-1.0-SNAPSHOT.jar richfaces-components-ui-4.0.0.
 Final.jar richfaces-components-api-4.0.0.Final.jar richfaces-core-api
 -4.0.0.Final.jar richfaces-core-impl-4.0.0.Final.jar cssparser-0.9.5.
 jar sac-1.3.jar guava-r08.jar
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Запись пути к классу ejb должна присутствовать для модуля EJB, для переносимости изаписи пути к классам richfaces, cssparser и guava НЕ должны быть в манифесте WAR.

Проблема в том, что моя WAR зависит от всех JAR-файлов, некоторые из которых находятся в WEB-INF/lib (RichFaces), иодин JAR Patrac-ejb-1.0-SNAPSHOT.jar, который находится в корневом каталоге EAR.Каждая зависимость должна быть введена в Patrac-web / pom.xml, но НЕ каждая из зависимостей должна появляться в манифесте.

Maven помещает JAR-файлы в правильные места, но помещает записи Class-Path для ВСЕХ JAR-файлов в манифест.Это не должно делать это.Должно быть введено ТОЛЬКО запись для Patrac-ejb-1.0-SNAPSHOT.jar.

  <!--
    According to Java EE 6 spec, the application is portable if
    Patrac-web.war's META-INF/MANIFEST.MF contains a Class-Path entry
    for Patrac-ejb-1.0-SNAPSHOT.jar.

    <optional>true</optional> is the flag that maven-war-plugin uses
    to put the entry in MANIFEST.MF without copying Patrac-ejb-1.0-SNAPSHOT.jar
    into WEB-INF/lib.  This is what I want.

    <scope>provided</scope> would cause maven-war-plugin to NEITHER
    put the entry in MANIFEST.MF nor copy Patrac-ejb.jar into WEB-INF/lib,
    which would not be good.

    No tag at all would cause maven-war-plugin to BOTH put the entry in
    MANIFEST.MF and copy Patrac-ejb.jar into WEB-INF/lib, which would
    also not be good.
  -->
  <dependency>
     <groupId>com.patrac</groupId>
     <artifactId>Patrac-ejb</artifactId>
     <type>ejb</type>
     <optional>true</optional>
  </dependency>

  <!--
   These two dependencies are used to copy
  the other JAR files into WEB-INF/lib and there
  should not be any class-path entries for such
  JARs in MANIFEST.MF, in order to avoid the
  error messages.
  -->
    <dependency>
        <groupId>org.richfaces.ui</groupId>
        <artifactId>richfaces-components-ui</artifactId>
    </dependency>
    <dependency>
        <groupId>org.richfaces.core</groupId>
        <artifactId>richfaces-core-impl</artifactId>
    </dependency>

Я использую самую последнюю версию плагина maven-war-plugin, 2.2.Как мне сказать плагину maven-war-plugin помещать JAR "не-ejb" в WEB-INF / lib, не помещая записи пути к классам в MANIFEST.MF?

Любые советы или указатели, которые у вас есть, приветствуются.

Ссылки:

Ответы [ 4 ]

20 голосов
/ 16 февраля 2012

Архиватор 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.

1 голос
/ 13 февраля 2012

Для тех JAR, которые необходимо исключить из MANIFEST и из WEB-INF/lib, необходимо пометить их как <scope>provided</scope>.Это означает, что JAR-файлы будут предоставляться контейнером (а это EAR в вашем случае).

Для других опций проверьте WAR-manifest guide .

0 голосов
/ 25 апреля 2014

читай конкретно про тощие войны

http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

0 голосов
/ 03 августа 2013

Должна присутствовать запись пути к классу ejb для модуля EJB…

Путь к классам должен присутствовать только для модулей EJB (в корне EAR), которые ссылаются на другие модули EJB (в корне того же EAR)

...