2013-11-15 50 views
1

我想打包一个将部署在GlassFish Server Open Source Edition上的EAR。 以下是pom.xml文件的相关部分。如何使用Maven打包GlassFish的EAR?

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    .... 
    <packaging>ear</packaging> 

    <dependencies> 
     .... 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ear-plugin</artifactId> 
       <version>2.8</version> 
       <configuration> 
        <version>6</version> 
        <defaultLibBundleDir>/lib</defaultLibBundleDir> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

我通常运行在命令端子mvn compilemvn package。由此产生的EAR具有以下结构。

EAR/lib/*.jar 
EAR/META-INF/application.xml 
EAR/META-INF/META-INF.MF 
EAR/META-INF/maven/... 

的application.xml是

<?xml version="1.0" encoding="UTF-8"?> 
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6"> 
    <display-name>test-app</display-name> 
    <library-directory>/lib</library-directory> 
</application> 

如果我尝试运行asadmin deploy test-app.ear部署EAR到GlassFish,我得到这个错误。

remote failure: Error occurred during deployment: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 22; Deployment descriptor file META-INF/application.xml in archive .... 

这里我重命名application.xmlglassfish-application.xml及其内容更改为

<!DOCTYPE glassfish-application PUBLIC "-//GlassFish.org//DTD 
GlassFish Application Server 3.1 Java EE Application 6.0//EN" 
"http://glassfish.org/dtds/glassfish-application_6_0-1.dtd"> 
<glassfish-application> 
    <unique-id>67488732739338240</unique-id> 
</glassfish-application> 

如果我重新运行asadmin deploy test-app.ear GlassFish的识别部署描述符,但抛出下一个错误,说Application [test-app] contains no valid components

在这里,我将所有罐子从EAR/lib/*.jar移动到EAR/META-INF/lib/*.jar

如果我现在重新运行asadmin deploy test-app.ear GlassFish将EAR识别为有效并部署它。

因为我不想每次都手动更改EAR。如何配置Maven来 1.输出有效application.xmlglassfish-application.xml 2.复制的依赖性不EAR/lib/EAR/META-INF/lib(如果确实有必要)提前

感谢。

回答

2

如何配置Maven来

  1. 输出一个有效的application.xml或与GlassFish的application.xml
  2. 复制的依赖性不EAR/lib中/但EAR/META-INF/LIB(如果确实有必要)
  • 的application.xml能由maven-ejb-plugin自动生成,对于简单的测试,我会将其保留至插件
  • for 依赖关系复制 - 这取决于您在耳朵中包装的内容(可以是war/jar/...)一般来说,让maven做到这一点是个好主意。为了你的目的,你错过了你的pom.xml部分,它会引用你想要包含在其中的模块(war/jar/...)
  • 此外,我没有看到非标准libs文件夹的原因指定如下:<library-directory>

所以我会去像目前here样品配置。

要包括有关章节回答:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <version>6</version> 
       <modules> 
        <webModule> 
         <groupId>com.mycompany</groupId> 
         <artifactId>myWar</artifactId> 
         <bundleFileName>myWarNameInTheEar.war</bundleFileName> 
         <contextRoot>/myWarConext</contextRoot> 
        </webModule> 
        <ejbModule> 
         <groupId>com.mycompany</groupId> 
         <artifactId>myEjb</artifactId> 
         <bundleFileName>myEjbNameInTheEar.jar</bundleFileName> 
        </ejbModule> 
       </modules> 
       <displayName>My Ear Name displayed in the App Server</displayName> 
       <generateApplicationXml>true</generateApplicationXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
<!-- Define the versions of your ear components here --> 
<dependencies> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>myWar</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>myEjb</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>ejb</type> 
    </dependency> 
</dependencies> 

请注意,您需要指定的依赖 - 的模块,但包括那些模块部分为好,让他们打包。

如有任何疑问,请随时询问。