如何使用Maven为GlassFish打包EAR?

时间:2013-11-15 18:12:55

标签: maven java-ee glassfish

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

<?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.xml重命名为glassfish-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(如果确实有必要)

提前致谢。

1 个答案:

答案 0 :(得分:2)

  

如何将Maven配置为

     
      
  1. 输出有效的application.xml或glassfish-application.xml
  2.   
  3. 将依赖项不复制到EAR / lib /但复制到EAR / META-INF / lib(如果确实有必要)
  4.   
  • application.xml 可以通过maven-ejb-plugin自动生成,对于简单的测试,我会将其留给插件
  • 用于依赖复制 - 这取决于你在耳中打包的内容(可以是war / jar / ...)但一般来说,让maven这样做是个好主意。出于你想要包含在那里的模块(war / jar / ...)的pom.xml部分,你会错过
  • 此外,我没有看到您指定的非标准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>

请注意,您需要指定依赖项 - 对于模块,但也包括模块部分中的那些,以便打包它们。

如果有任何其他问题,请随时询问。