如何使用Maven构建包含EJB和WAR的EAR项目?

10

我尝试使用EJB和WAR创建EAR项目,但是遇到了一些问题。 我从Java EE 6 EAR原型创建了主要的项目:

<dependency>
    <groupId>org.codehaus.mojo.archetypes</groupId>
    <artifactId>ear-javaee6</artifactId>
    <version>1.5</version>
</dependency>

接下来我使用Java EE 6 EJB JAR Archetype创建了EJB模块:

<dependency>
    <groupId>org.codehaus.mojo.archetypes</groupId>
    <artifactId>ejb-javaee6</artifactId>
    <version>1.5</version>
</dependency>

然后我从Javax Faces WAR Archetype创建了第二个模块:

<dependency>
    <groupId>javax.faces</groupId>
    <artifactId>javax.faces-war-archetype</artifactId>
    <version>2.2</version>
</dependency>

然后我在主要的pom.xml文件中添加了依赖:

<!-- Define the versions of your ear components here -->
<dependencies>
    <dependency>
        <groupId>QCforCC-main</groupId>
        <artifactId>QCforCC-ejb</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>ejb</type>
    </dependency>
    <dependency>
        <groupId>QCforCC-main</groupId>
        <artifactId>QCforCC-war</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>war</type>
    </dependency>
</dependencies>

然后我尝试使用maven clean和install构建项目,但是出现了错误:

  [ERROR] The projects in the reactor contain a cyclic reference: Edge between 'Vertex{label='QCforCC-main:QCforCC-war:1.0-SNAPSHOT'}' and 'Vertex{label='QCforCC-main:QCforCC-ejb:1.0-SNAPSHOT'}' introduces to cycle in the graph QCforCC-main:QCforCC-ejb:1.0-SNAPSHOT --> QCforCC-main:QCforCC-war:1.0-SNAPSHOT --> QCforCC-main:QCforCC-ejb:1.0-SNAPSHOT -      [Help 1] 
  [ERROR]
  [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
  [ERROR] Re-run Maven using the -X switch to enable full debug logging. 
  [ERROR]  
  [ERROR] For more information about the errors and possible solutions, please read the following articles: 
  [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectCycleException

  Process finished with exit code 1

在 EAR 中,pom.xml 文件中我有以下内容:

<modules>
    <module>QCforCC-ejb</module>
    <module>QCforCC-war</module>
</modules>
<packaging>pom</packaging>

但是如果我将<packaging>pom</packaging>改为<packaging>ear</packaging>, IDEA会在弹出窗口中显示错误:

  Some problems were encountered while processing the POMs: 
  [WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-ear-plugin @ line 41, column 21 
  [ERROR]   'packaging' with value 'ear' is invalid. Aggregator projects require 'pom' as packaging. @ line 12, column 16
2个回答

15

我强烈建议您了解多模块构建的工作原理。 Sonatype书中有一个很好的章节,详细描述

要构建具有EJB和WAR的EAR,您实际上需要三个模块:EJB、WAR和EAR。 父POM只是将所有内容整合在一起,并具有POM打包类型。

因此,父pom.xml应如下所示:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.sonatype.mavenbook.multi</groupId>
    <artifactId>simple-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>
    <name>Multi Chapter Simple Parent Project</name>

    <modules>
        <module>ejb-module</module>
        <module>war-module</module>
        <module>ear-module</module>
    </modules>
</project>

然后,每个子POM将如下所示:

ejb-module/pom.xml:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sonatype.mavenbook.multi</groupId>
        <artifactId>simple-parent</artifactId>
      <version>1.0</version>
    </parent>
    <artifactId>ejb-module</artifactId>
    <packaging>ejb</packaging>
</project>

war-module/pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sonatype.mavenbook.multi</groupId>
        <artifactId>simple-parent</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>war-module</artifactId>
    <packaging>war</packaging>
    <name>simple-webapp Maven Webapp</name>
    <dependencies>
        <dependency>
            <groupId>org.sonatype.mavenbook.multi</groupId>
            <artifactId>ejb-module</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

ear-module/pom.xml:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sonatype.mavenbook.multi</groupId>
        <artifactId>simple-parent</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>ear-module</artifactId>
    <packaging>ear</packaging>
    <name>EAR module</name>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.10.1</version>
                <configuration>
                    <ejbModule>
                        <groupId>org.sonatype.mavenbook.multi</groupId>
                        <artifactId>ejb-module</artifactId>
                        <bundleFilename>ejb-module.jar</bundleFilename>
                    </ejbModule>
                    <webModule>
                        <groupId>org.sonatype.mavenbook.multi</groupId>
                        <artifactId>war-module</artifactId>
                        <contextRoot>/foo</contextRoot>
                    </webModule>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

什么是 <ejbModule> 和 <webModule>? - Pavel
1
请参考此处的maven-ear-plugin文档:https://maven.apache.org/plugins/maven-ear-plugin/modules.html - sh0rug0ru
Artifact QCforCC-ear:ejb exploded: java.io.IOException: com.sun.enterprise.admin.remote.RemoteFailureException: 无法识别 C:\app\QCforCC-mainApp\QCforCC-ear\target\QCforCC-ear-1.0-SNAPSHOT 的归档类型。 - Pavel
请编辑您的问题,附上更新后的POM文件、您运行的命令以及构建输出。 - sh0rug0ru
4
认为ejbModule和webModule应该放在一个名为<modules>的元素中。 - Tom Chamberlain

0
  1. parent QCforCC-parent:

    <artifactId>QCforCC-parent</artifactId>
    <packaging>pom</packaging>
    ...
    ...
    <modules>
        <module>QCforCC-ear</module>
        <module>QCforCC-ejb</module>
        <module>QCforCC-war</module>
    </modules>
    
  2. QCforCC-ear:

    <artifactId>QCforCC-ear</artifactId>
    <packaging>ear</packaging>
    ...
    ...
    <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-ear-plugin</artifactId>
         <configuration>
           <version>5</version>
           <displayName>XXXXXXXX</displayName>  
           <modules>
              <webModule>             
                 <moduleId>WebModule_XXX</moduleId>
                 <groupId>${project.groupId}</groupId>
                 <artifactId>>QCforCC-war</artifactId>   
                <contextRoot>XXXXXXXX</contextRoot>
              </webModule>  
                 <jarModule>
                             <groupId>${project.groupId}</groupId>
                             <artifactId>QCforCC-ejb</artifactId>
                  </jarModule>            
           </modules>  
         </configuration>
       </plugin>
    </plugins>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接