【问题标题】:Maven creation of a WAR and an EAR containing that WAR as one module using classifier?Maven 使用分类器创建一个 WAR 和一个包含该 WAR 作为一个模块的 EAR?
【发布时间】:2012-03-23 23:32:21
【问题描述】:

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

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

我的愿望背后的原因是因为我正在考虑重组我们打包发布的 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

我正在尝试做的事情可能吗?

【问题讨论】:

  • 考虑让你的 pom.xml 在你的战争项目中只处理战争,并在部署时调用一个单独的“deploy-as-ear”pom.xml。
  • 如果您想拥有更清洁的东西,那么这不是要走的路。据我所知,你试图做的事情是不可能的,因为你隐含地创建了一个无限的依赖循环。您可能会在 Maven-user ML 上找到更好的选择
  • 在工作中,我们创建了一个自定义 maven 插件,它将项目依赖项和工件打包在一个耳朵内,并根据工件类型创建部署描述符。与配置为创建瘦战争的战争插件一起,这非常有效。这些项目最初是使用 oracles jdeveloper 创建的,默认情况下使用类似的 pakcaging。我必须检查是否可以以某种方式发布。

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


【解决方案1】:

您必须更改的第一件事是根据 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> 

这种方法的优点是你把属于ear的信息和属于ear模块的信息分开了。

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

【讨论】:

  • 感谢您的回答,但我知道该怎么做。但是,我想避免额外的模块只是为了在这个 EAR 中包装一个 WAR(因为我有很多我想在 EAR 中包装)
  • 随你喜欢,但你会开始与maven战斗......;-) 数字不是参数......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2011-02-27
  • 2012-03-23
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多