一、引言
Q群的朋友问道可不可以在多个Web应用间合并打包成一个WAR来发布,现实情况下也存在,比如一个某大型电子商务网站,包含有机票、酒店、旅游、VIP客户等频道,其实每个频道都是分开独立的应用,但是主站上页头和页尾是公用的,怎么把主站的公共部分无缝集成到各个频道,这就颇具现实意义了,当然这只是部分运用。还有就是在项目扩展的时候,有些项目不是通过Maven构建的,并且规定你只能在它的上面进行拓展。暂时举例说明吧,还有更多的领域可以用到,我只是抛砖引玉一下而已。
二、教程
到底有没有这样的插件来实现呢,答案是肯定的。本章给你介绍Maven WAR Plugin的<overlays>,你可称之为“重迭”或者“覆盖”。
Overlays(覆盖)主要用于跨多Web项目间共享公共资源。它能够在目标WAR本身覆盖除了原生WAR构件以外的所有文件,并在WEB-INF/lib目录下收集原生WAR项目的依赖。
下面通过一些简单的示例描述一下Overlays的功能,包括Overlays支持的类型、配置、打包过程中的执行顺序、包含/排除文件和全局配置等等。最后还简单讲了如何进行ZIP格式文件的覆盖。
1、Overlays总览
为了达到演示的效果,我们首先鉴于此架设名为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下声明它作为当前项目的依赖:
…
<dependencies>
<dependency>
<groupId>com.example.projects</groupId>
<artifactId>documentedprojectdependency</artifactId>
<version>1.0-SNAPSHOT</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
…
</dependencies>
…
接下来,我们查看documentedprojectdependency WAR文件的结构,大致如下:
documentedprojectdependency-1.0-SNAPSHOT.war
| |– 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中。
2、Overlays支持类型
WAR插件可以处理war和zip格式构件的覆盖。不过,为了保持向后兼容,zip覆盖仅仅在WAR插件的配置中明确定义了它们以后才处理。
3、配置Overlays
在WAR插件的以往版本中,配置并不总是必须的。如果你觉得使用默认设置能很好满足要求,那就继续这么做。但是如果你需要更多的控制,那么你就歹好好看看下面的部分了。
<overlay>元素包含有下列子元素:
-
id - overlay id。如果你不提供的话,WAR插件将自动生成一个。
-
groupId - 配置你想要覆盖的groupId。
-
artifactId – 配置你想要覆盖的构件的artifactId。
-
type – 配置你想要覆盖的构件类型。默认值是:war。
-
classifier – 如果有多个构件匹配当前的groupId/artifactId,那么你需要配置构件的classifier以明确覆盖(classifier:该元素用来帮助定义构建输出的一些附属构件)。
-
includes - 要包含的文件。默认情况下,所有文件都能被包含。
-
excludes – 要排除的文件。默认情况下,在META – INF目录是被排除在外的。
-
targetPath - 在webapp结构的目标相对路径,当然这只在覆盖类型为war时才有效。默认情况下,覆盖的内容都追加在webapp的根节点下。
-
skip – 当设置为true时,跳过本次覆盖。默认值是:false。
说了这么多,还是举实例会比较直观一点。
比如,我要排除我们的documentedprojectdependency.war下的sampleimage-dependency.jpg来覆盖目标war文件:
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</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>
…
4、Overlays的打包
Overlays采用第一直达者优先的策略(因此,如果一个文件被某一个副本覆盖过,则它不会被另一个副本继续覆盖)。
Overlays的应用步骤依照它们在<overlays>配置的顺序。如果没有指定配置,那么它们的依赖关系将按照POM定义的顺序来调用(警告:这有很多的不确定性,特别是在您使用传递性依赖来覆盖的时候)。如果当前项目运用了复合覆盖的情况(即同时包含配置型覆盖和非配置型覆盖),非配置型覆盖应用于配置型覆盖之后。
默认情况下,该项目源(亦称当前构建)遵循按pom.xml上下文中依赖的先后顺序进行追加(如任何覆盖元素已被应用之前)。当前构建定义了一个没有groupId和artifactId的特殊覆盖方式。如果overlays需要应用第一(直达者优先)原则,那么就只需简单地配置当前构建在这些覆盖之后。
例如,假设groupid为com.example.projects的my-webapp是当前项目的一个依赖,而你需要首先应用它,操作如下:
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<overlays>
<overlay>
<groupId>com.example.projects</groupId>
<artifactId>my-webapp</artifactId>
</overlay>
<overlay>
<!– 空 groupId/artifactId代表当前构建 –>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
…
注意:在上述情况下,没有配置在<overlays>元素的其它WAR依赖都会应用在当前构建之后。
如果你想要执行一项更好更精细的覆盖策略,overlays能通过不同的includes/exclude元素进行多重打包。例如,我想要在当前项目中使用my-webapp的 index.jsp覆盖文件,但是my-webapp的其它文件还是按照常规方式来控制,鉴于此,我们必须要为 my-webapp定义两个覆盖配置:
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</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>
<!– 空 groupId/artifactId代表当前构建 –>
</overlay>
<!– 如果有必要的话,就把其它overlays配置在这里 –>
<overlay>
<id>my-webapp</id>
<groupId>com.example.projects</groupId>
<artifactId>my-webapp</artifactId>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
…
5、Overlay全局设置
下面的设置能指定全局性的Overlay和修改所有Overlay的应用方式。
-
dependentWarIncludes - 设置此包含默认值适用于所有的overlay。没有指定includes元素的overlay都将继承此默认设置。
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<dependentWarIncludes>**/IncludeME,**/images</dependentWarIncludes>
</configuration>
</plugin>
</plugins>
…
-
dependentWarExcludes - 设置此排除默认值适用于所有的overlay。没有指定excludes元素的overlay都将继承此默认设置。
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<dependentWarExcludes>WEB-INF/web.xml,index.*</dependentWarExcludes>
</configuration>
</plugin>
</plugins>
…
-
workDirectory – 设置overlays临时提取的目录。
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<!– default value is target/war/work –>
<workDirectory>/tmp/extract_here</workDirectory>
</configuration>
</plugin>
</plugins>
…
-
useCache – 设置true时,能启用webapp架构缓存。默认值:false。
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<useCache>true</useCache>
</configuration>
</plugin>
</plugins>
…
6、ZIP依赖的覆盖
要想使一个zip依赖作为一个覆盖,你必须在插件配置中指定它。例如你要在Web应用的scripts目录下通过一个zip覆盖注入内容,操作如下:
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<overlays>
<overlay>
<groupId>zipGroupId</groupId>
<artifactId>zipArtifactId</artifactId>
<type>zip</type>
<targetPath>scripts</targetPath>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
…
三、参考资料
1、http://maven.apache.org/plugins/maven-war-plugin-2.1-alpha-2/overlays.html
2、http://maven.apache.org/plugins/maven-war-plugin/overlays.html
分享到:
相关推荐
Maven实践-使用Maven开发Web应用 Maven实践-使用Maven开发Web应用 Maven实践-使用Maven开发Web应用
使用Maven开发Java Web应用,用于安装在eclipse的指导。
文章地址如下:https://blog.csdn.net/sdksdk0/article/details/80678434 自定义maven插件的实现
使用Maven创建Web应用程序项目 Maven POM Maven 构建生命周期 Maven 构建配置文件 Maven存储库 Maven插件 Maven创建Java项目 使用Maven构建和测试Java项目 Maven外部依赖 Maven项目文档 Maven项目模板 Maven快照 ...
apache-maven的插件包:apache-maven-3.3.9-bin.zip。。
Maven多模块web应用实例
详细 介绍 了如何使用Maven插件构建Docker镜像的步骤。
可是在网上又找不到对应的m2e包(我用的eclipse4.7),于是我决定将站点下的文件(很多)用爬虫爬下来,打包成离线插件包,再通过网上提供的多种离线安装插件的方法,我终于能自由的安装eclipse的maven插件了。...
eclipse maven 离线插件
maven依赖war构件 技术交流希望 这个工程简单的介绍一下怎么在开发环境
maven-plantuml-plugin, 使用PlantUML语法生成UML图的Maven 插件 然而,这个项目不再被维护了。使用语法生成UML图表的一个 Maven 插件插件。重要说明如果你想使用PlantUML大于 8031的版本,你必须使用这个插件的版本...
Maven-assembly-plugin是maven中针对打包任务而提供的标准插件,可以实现自定义打包。主要提供如下功能: ● 提供一个把工程依赖元素、模块、网站文档等其他文件存放到单个归档文件里。 ● 打包成指定格式分发包,...
对于eclipse无法在线安装maven插件的解决办法。首先windows配置maven环境,然后在eclipse离线安装maven插件。具体方法可以在我的博客中看到
4、在links中新建maven.txt文件,内容为插件地址,例如:path=D:\eclipse_gzds\myplugins\maven(注意这里斜杠,不是反斜杠) 5、将maven.txt扩展名改为maven.lin 6、在eclipse根目录下找到eclipse.ini并打开,在...
如何使用 Maven 创建一个 Java Web 项目(Spring MVC)。 用到的技术/工具: Maven 3.3.3 Eclipse 4.3 JDK 8 Spring 4.1.1.RELEASED Tomcat 7 Logback 1.0.13
教你如何给eclipse安装maven插件,废话不多说,有图有真相
idea使用maven创建web项目详细教程
官网公布的 Eclipse 的 Maven2 插件,本插件版本是:m2e-0.12.0.20101115-1102,大小 11 MB。 关于安装 Maven2 插件到 Eclipse 的详细步骤,请参考博客《集成 Maven 2 插件到 eclipse 的过程》,博客地址:...
Maven使用tomcat8-maven-plugin插件