web-dev-qa-db-ja.com

maven-war-pluginでマニフェストクラスパスを正しく設定する方法

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

アプリケーションのソースコードディレクトリでは、pomは次の場所にあります。

.
|
|-- 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がWEB-INF/lib(RichFaces)に存在するすべてのJARと、EARのルートディレクトリに存在する1つのJAR Patrac-ejb-1.0-SNAPSHOT.jarに依存していることです。各依存関係はPatrac-web/pom.xmlに入力する必要がありますが、各依存関係がマニフェストに表示される必要はありません。

MavenはJARを正しい場所に配置しますが、すべての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に「非ejb」JARをWEB-INF/libに入れるように指示し、MANIFEST.MFにクラスパスエントリを置かないようにするにはどうすればよいですか?

あなたが持っているアドバイスやポインタは大歓迎です。

参照:

16
Patrick Garner

MavenアーカイバMaven WARプラグイン によって使用され、WARのマニフェストにClass-Pathエントリを生成する手段を提供しますが、残念ながらアーカイバはオールオアナッシングアプローチをとります。 addClassPath=trueをアーカイブ構成に渡すと、アーカイバは、WARの必須およびオプションの依存関係のallのクラスパスエントリをマニフェスト。

ただし、一部のエントリはそこに属していません。 Class-Pathエントリは、WARへの "Download Extensions、" またはJARへの参照externalを示すために使用されます。 WEB-INF/libにあるJARは、しないでくださいので、WARのマニフェストにClass-Pathエントリがあります。 MavenのWarプラグインは、アーカイバーでaddClassPath=trueを設定すると、このルールに違反します。

さらに、addClassPath=trueをMavenのアーカイバに渡すと、EAR内のどこに依存関係があるかに関係なく、すべてのClass-Pathエントリに同じディレクトリプレフィックスが付与されます。これにより、オプションの依存関係と必須の依存関係がEARルートディレクトリ、EAR libやWAR WEB-INF/libなどの別の場所にある場合に問題が発生します。

当然、WARマニフェストに上記のエラーが含まれるEARをデプロイすると、WARクラスローダーが最終的に依存関係(WEB-INF/libにあるJAR)を検出できる場合、JBossは警告をスローします。 EJB JARまたはEAR libディレクトリの依存関係)。

したがって、私のようなWARがEARのルートにあるEJBモジュールと、WEB-INF/libにある任意の数の依存関係に依存している場合、Mavenアーカイバーはすべての依存関係のクラスパスエントリを生成しますまた、EAR内の場所に関係なく、すべて同じ接頭辞になります。

良くない。

アーカイバがWEB-INFにあるJARのClass-Pathエントリを除外する手段を提供する場合、問題は多少改善されます。しかし、そうではありません。

次に、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エントリ生成をオフにすることです。代わりに、アーカイバのmanifestEntriesオプションを使用して、WARのマニフェストにEJBモジュールのClass-Pathエントリを明示的に作成します。これを行う方法は、Patrac-web/pom.xmlから以下を削除することです:

<manifest>
    <addClasspath>true</addClasspath>
</manifest>

これに置き換えます:

<manifestEntries>
    <Class-Path>Patrac-ejb-${project.version}.jar</Class-Path>
</manifestEntries>

この構成を使用すると、EJBモジュールのClass-Pathエントリが1つだけ明示的に作成されます。

21
Patrick Garner

MANIFESTおよびWEB-INF/libから除外する必要があるJARについては、それらを<scope>provided</scope>としてマークする必要があります。これは、JARファイルがコンテナーによって提供されることを意味します(あなたの場合はEARです)。

他のオプションについては、 WARマニフェストガイド を確認してください。

1
dma_k

EJBモジュールのejbクラスパスエントリが存在する必要があります…

クラスパスは、(同じEARのルートにある)他のEJBモジュールを参照する(EARのルートにある)EJBモジュールに対してのみ存在する必要があります。

0
0
Kalpesh Soni