使用分类器将Maven创建WAR和包含该WAR的EAR作为一个模块?

时间:2012-03-06 13:22:05

标签: java maven maven-2 classification maven-war-plugin

我知道这可能听起来像是错误的事情,但我正在尝试的是拥有一个Maven POM(模块),安装时将打包为WAR但另外,作为包含单个WAR的EAR

澄清一下:我希望将自己的 EAR中的每个现有WAR包装在我的项目中。

我的愿望背后的原因是因为我正在考虑重组我们发布的WAR的方式,以便每个包含在一个EAR中(但仍然生成一个独立的WAR工件,以便于开发)。我并不热衷于创建一个依赖于WAR的新模块并将其打包在EAR中,因为我有大量的WAR。

目前我正在尝试使用分类器,对于我现有的一个WAR模块,没有成功:

<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">
    <parent>
        ...
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>se-index-webapp</artifactId>
    <packaging>war</packaging>

    <build>
        <plugins>

            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    ...
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <finalName>search-index.ear</finalName>
                    <classifier>ear</classifier>
                    <unpackTypes>war</unpackTypes>
                    <modules>
                        <webModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${artifactId}</artifactId>
                            <uri>search-index.war</uri>
                            <bundleFileName>search-index.war</bundleFileName>
                            <contextRoot>/SearchIndex</contextRoot>
                        </webModule>
                    </modules>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${artifactId}</artifactId>
                        <version>${project.version}</version>
                        <type>war</type>
                    </dependency>
                </dependencies>
            </plugin>

        </plugins>
    </build>

    <dependencies>  
        ...
    </dependencies>

</project>

我收到错误:

Artifact[war:myproject:se-index-webapp] is not a dependency of the project

我正在尝试做什么?

1 个答案:

答案 0 :(得分:0)

您必须更改的第一件事是基于Maven约定,以获得单独的EAR模块,从而产生以下结构:

  +-- root (pom.xml)
       +--- mod-ear (pom.xml) packaging: ear
       +--- mod-war (pom.xml) packaging: war

通过给出

,你可以非常简单地定义mod-war模块的依赖关系
   <dependencies>
      <dependency>
          <groupId>..</groupId>
          <artifactId>..</artifactId>
          <version>..</version>
      </dependency>
   ...
  </dependencies> 

这种方法的优势在于您将属于耳朵的信息与属于耳模块的信息分开。

结果是您可以在根级别执行mvn clean包,或者执行mvn install / deploy,它将war以及ear部署到您的存储库中。