如何设置舱单类

我使用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

在应用程序源代码目录中,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放在正确的位置,但它将所有JAR的Class-Path条目放入清单中。 它不应该这样做。 它只应该为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?

任何建议或指针,你有非常感谢。

参考文献:

  • Maven War Plugin
  • Maven耳朵插件

  • 由Maven WAR插件使用的Maven归档器提供了一种在WAR清单中生成Class-Path条目的方法,但不幸的是归档器采取了全有或全无的方法。 将addClassPath=true传递给归档配置后,归档程序会将所有WAR的必需和可选依赖项的类路径条目放入清单中。

    但是,有些条目根本不属于那里。 类路径条目用于表示“下载扩展”,或对WAR外部的JAR的引用。 因此,位于WEB-INF/lib JAR不应在WAR的清单中具有Class-Path条目。 当您在存档器中设置addClassPath=true时,Maven's War插件会打破此规则。

    而且,当您将addClassPath=true传递给Maven的归档器时,它将为所有Class-Path条目指定相同的目录前缀 - 无论EAR中的依赖关系位于何处。 当可选和必需的依赖关系位于不同的位置(如EAR根目录,EAR lib和WAR WEB-INF/lib时,这会导致问题。

    当然,当部署WAR清单包含上述错误的EAR时,如果WAR类加载器最终能够找到依赖项(位于WEB-INF/lib JAR),或者如果类路径前缀错误(例如, EJB JAR或EAR lib目录中的依赖项)。

    因此,如果您的WAR与我的WAR一样,依赖于位于EAR根目录的EJB模块以及位于WEB-INF/lib任意数量的依赖项,Maven归档器将生成所有对象的Class-Path条目不管它们在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条目被明确创建。


    对于需要从MANIFESTWEB-INF/lib排除的JAR,您需要将它们标记为<scope>provided</scope> 。 这意味着JAR文件将由容器提供(在您的情况下,这是EAR)。

    对于其他选项,请查看WAR清单指南。


    需要为EJB模块提供ejb类路径条目...

    对于引用其他EJB模块的EJB模块(在EAR的根中),类路径只需要存在(在相同EAR的根目录中)

    链接地址: http://www.djcxy.com/p/82659.html

    上一篇: How to set up manifest class

    下一篇: Packaging a WAR file in an EAR so that WAR dependencies are available