叠加层

覆盖用于跨多个 Web 应用程序共享公共资源。WAR 项目的依赖项收集在 中WEB-INF/lib,但覆盖在 WAR 项目本身上的 WAR 工件除外。

叠加层一览

为了演示,给定项目的这种结构documentedproject

 |-- pom.xml
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   |-- images
         |   |   `-- sampleimage.jpg
         |   `-- sampleresource
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

该项目依赖于另一个 WAR 工件 ,documentedprojectdependency-1.0-SNAPSHOT.war它被声明为项目的依赖项pom.xml

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.example.projects</groupId>
      <artifactId>documentedprojectdependency</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
      <scope>runtime</scope>
    </dependency>
    ...
  </dependencies>
  ...
</project>

WAR 文件的结构documentedprojectdependency如下所示:

documentedprojectdependency-1.0-SNAPSHOT.war
 |-- META-INF
 |   |-- MANIFEST.MF
 |   `-- maven
 |       `-- com.example.projects
 |           `-- documentedprojectdependency
 |               |-- pom.properties
 |               `-- pom.xml
 |-- WEB-INF
 |   |-- classes
 |   |   |-- com
 |   |   |   `-- example
 |   |   |       `-- projects
 |   |   |           `-- SampleActionDependency.class
 |   |   `-- images
 |   |       `-- sampleimage-dependency.jpg
 |   `-- web.xml
 `-- index-dependency.jsp

由此产生的 WAR 最终会是这样的:

 |-- META-INF
 |   |-- MANIFEST.MF
 |   `-- maven
 |       `-- com.example.projects
 |           `-- documentedproject
 |               |-- pom.properties
 |               `-- pom.xml
 |-- WEB-INF
 |   |-- classes
 |   |   |-- com
 |   |   |   `-- example
 |   |   |       `-- projects
 |   |   |           |-- SampleAction.class
 |   |   |           `-- SampleActionDependency.class
 |   |   `-- images
 |   |       |-- sampleimage-dependency.jpg
 |   |       `-- sampleimage.jpg
 |   `-- web.xml
 |-- index-dependency.jsp
 |-- index.jsp
 `-- jsp
     `-- websource.jsp

上面的web.xml文件来自documentedproject.

叠加类型

WAR 插件将warzip工件作为覆盖处理。但是,出于向后兼容性的原因,只有在插件配置中明确定义了 zip 覆盖时才会处理它们。

配置叠加

在以前版本的 WAR 插件中,不需要进行任何配置。如果您对默认设置感到满意,情况仍然如此。但是,如果您需要更多控制,请继续阅读!

该元素可以具有以下子元素:<overlay>

  • id - 叠加层的 id。如果没有提供,WAR 插件将生成一个。
  • groupId - 您要配置的覆盖工件的 groupId。
  • artifactId - 您要配置的覆盖工件的 artifactId。
  • type - 您要配置的覆盖工件的类型。默认值为:war
  • 分类器- 如果多个工件与 groupId/artifactId 匹配,则要配置的覆盖工件的分类器。
  • 包含- 要包含的文件。默认情况下,包含所有文件。
  • excludes - 要排除的文件。默认情况下,该META-INF/MANIFEST.MF文件被排除在外。
  • targetPath - webapp 结构中的目标相对路径,仅适用于 类型的覆盖war。默认情况下,叠加层的内容会添加到 webapp 的根结构中。
  • 跳过- 设置为true跳过此覆盖。默认值为:false
  • 已过滤- 是否对此叠加应用过滤。默认值为false

例如,要排除sampleimage-dependency.jpg我们documentedprojectdependency war上面的覆盖:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <overlays>
            <overlay>
              <groupId>com.example.projects</groupId>
              <artifactId>documentedprojectdependency</artifactId>
              <excludes>
                <exclude>WEB-INF/classes/images/sampleimage-dependency.jpg</exclude>
              </excludes>
            </overlay>
          </overlays>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

覆盖包装

覆盖以先赢策略应用(因此,如果文件已被一个覆盖复制,则不会被另一个复制)。覆盖按在<overlays>配置中定义的顺序应用。如果未提供配置,则使用在 POM 中定义依赖项的顺序(警告:这不是确定性的,特别是如果您将覆盖作为传递依赖项)。在混合情况的情况下(例如,已配置的覆盖和未配置的覆盖),在已配置的覆盖之后应用未配置的覆盖。

默认情况下,首先添加项目的源(也就是当前构建)(例如,在应用任何覆盖之前)。当前构建被定义为没有groupId,的特殊覆盖artifactId。如果需要首先应用覆盖,只需在这些覆盖之后配置当前构建。

例如,如果my-webappfrom com.example.projectsgroup是项目的依赖,需要在项目自己的source之前应用,请执行以下操作:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <overlays>
            <overlay>
              <groupId>com.example.projects</groupId>
              <artifactId>my-webapp</artifactId>
            </overlay>
            <overlay>
              <!-- empty groupId/artifactId represents the current build -->
            </overlay>
          </overlays>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

注意:在上述场景中,任何其他 WAR 依赖项都将在当前构建之后应用,因为它们尚未在<overlays>元素中配置。

为了执行更细粒度的覆盖策略,可以使用不同的包含/排除多次打包覆盖。例如,如果必须index.jsp在 webapp 中设置叠加文件,但可以通过常规方式控制其他文件,则为 定义两个叠加配置:my-webapp my-webapp

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <overlays>
            <overlay>
              <id>my-webapp-index.jsp</id>
              <groupId>com.example.projects</groupId>
              <artifactId>my-webapp</artifactId>
              <includes>
                <include>index.jsp</include>
              </includes>
            </overlay>
            <overlay>
              <!-- empty groupId/artifactId represents the current build -->
            </overlay>

            <!-- Other overlays here if necessary -->

            <overlay>
              <id>my-webapp</id>
              <groupId>com.example.projects</groupId>
              <artifactId>my-webapp</artifactId>
            </overlay>
          </overlays>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

覆盖全局设置

可以全局指定以下设置并修改所有覆盖的应用方式。

  • dependentWarIncludes - 设置默认包含以应用于所有覆盖。默认情况下,任何没有特定includes元素的叠加层都将继承此设置。
    <project>
        ...
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
              <dependentWarIncludes>**/IncludeME,**/images</dependentWarIncludes>
            </configuration>
           </plugin>
        </plugins>
        ...
    </project>
  • dependentWarExcludes - 设置默认排除以应用于所有覆盖。默认情况下,任何没有特定excludes元素的叠加层都将继承此设置。
    <project>
        ...
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
              <dependentWarExcludes>WEB-INF/web.xml,index.*</dependentWarExcludes>
            </configuration>
           </plugin>
        </plugins>
        ...
    </project>
  • workDirectory - 设置临时提取覆盖的目录。
    <project>
        ...
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
              <!-- default value is target/war/work -->
              <workDirectory>/tmp/extract_here</workDirectory>
            </configuration>
           </plugin>
        </plugins>
        ...
    </project>

带有覆盖的 Zip 依赖项

要将zip依赖项用作覆盖,您必须在插件的配置中显式配置它。例如,要scripts在 webapp 的目录中注入 zip 覆盖的内容,请执行以下操作:

<project>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <overlays>
            <overlay>
              <groupId>zipGroupId</groupId>
              <artifactId>zipArtifactId</artifactId>
              <type>zip</type>
              <targetPath>scripts</targetPath>
            </overlay>
          </overlays>
        </configuration>
      </plugin>
    </plugins>
    ...
</project>