覆盖用于跨多个 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 插件将war和zip工件作为覆盖处理。但是,出于向后兼容性的原因,只有在插件配置中明确定义了 zip 覆盖时才会处理它们。
在以前版本的 WAR 插件中,不需要进行任何配置。如果您对默认设置感到满意,情况仍然如此。但是,如果您需要更多控制,请继续阅读!
该元素可以具有以下子元素:<overlay>
war
。META-INF/MANIFEST.MF
文件被排除在外。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-webapp
from com.example.projects
group是项目的依赖,需要在项目自己的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>
可以全局指定以下设置并修改所有覆盖的应用方式。
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>
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>
<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依赖项用作覆盖,您必须在插件的配置中显式配置它。例如,要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>