2013-11-15 57 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> 

請注意,您需要指定的依賴 - 的模塊,但包括那些模塊部分爲好,讓他們打包。

如有任何疑問,請隨時詢問。