`
lovefly_zero
  • 浏览: 390090 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

使用Maven WAR插件实现多Web应用间的重迭运用

阅读更多

一、引言

         

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

分享到:
评论
3 楼 自闭丨先生 2017-07-29  
melin 写道
缺少合并web.xml文件功能。不过使用了servlet3.0功能,就不存在web.xml合并问题、

请教一下web.xml需要怎么合并?如果在本项目中也定义了web.xml,那么被合并的war中里面的web.xml就被覆盖了吧?是不是意味着,我需要把被合并war里面的web.xml配置复制过来,然后再此基础上修改?另外为什么说servlet3.0不存在合并问题呢?
2 楼 melin 2011-12-22  
使用jetty运行,可以在一个容器运行多个web工程
http://docs.codehaus.org/display/JETTY/Multiple+WebApp+Source+Directory

<build><plugins>    <plugin>        <groupId>org.mortbay.jetty</groupId>        <artifactId>maven-jetty-plugin</artifactId>        <version>6.1.12</version>        <configuration>            <scanIntervalSeconds>2</scanIntervalSeconds>            <webAppConfig>                <contextPath>/</contextPath>                <baseResource implementation="org.mortbay.resource.ResourceCollection">                    <resourcesAsCSV>src/main/webappC,../cms/src/main/webappB</resourcesAsCSV>                </baseResource>            </webAppConfig>        </configuration>    </plugin></plugins></build>
1 楼 melin 2011-12-22  
缺少合并web.xml文件功能。不过使用了servlet3.0功能,就不存在web.xml合并问题、

相关推荐

    使用Maven开发Java Web应用

    【使用Maven开发Java Web应用】的详细指南 在Java Web开发中,管理各种框架的jar包及其依赖是一项挑战。传统的构建工具Ant逐渐被Maven和Gradle等更先进的工具取代,尤其是Maven,它提供了强大的依赖管理和项目构建...

    Maven实践-使用Maven开发Web应用

    Maven插件是实现特定功能的工具,如Tomcat插件可以实现本地部署和运行Web应用。通过在POM.xml中配置相关插件,我们可以使用命令行工具`mvn tomcat7:run`来启动一个内嵌的Tomcat服务器,实时查看和调试应用。 在开发...

    maven 多war部署

    如果需要在同一个Tomcat服务器上部署多个WAR应用,可以使用Maven的Tomcat插件(maven-tomcat-plugin或tomcat7-maven-plugin)实现热部署。在每个子模块的pom.xml中添加插件配置,并设置不同的上下文路径,例如: ``...

    apache-maven的插件包:apache-maven-3.3.9-bin.zip

    Apache Maven 是一个强大的项目管理和构建工具,广泛应用于...通过使用Maven的插件系统,开发者可以高效地完成各种任务,而无需编写自定义脚本。对于大型项目或团队协作来说,Maven的标准化和自动化特性是极其宝贵的。

    自定义maven插件的实现

    本篇文章将深入探讨如何实现自定义的Maven插件。 首先,了解Maven插件的基本结构至关重要。一个Maven插件通常由一组Mojo(Maven Goal Object)组成,每个Mojo就是一个可执行的任务。要创建自定义插件,你需要定义一...

    使用Maven Cargo 插件管理Tomcat6的部署

    在IT行业中,管理和部署Web应用程序是一项关键任务,而Maven Cargo插件则为开发者提供了一个强大的工具,使得在Tomcat6上部署应用变得更加便捷。Cargo是一个用于自动化服务器和容器管理的Java库,它允许开发者在多种...

    Maven多模块web应用实例

    本实例聚焦于"Maven多模块web应用",将详细介绍如何使用Maven构建一个多模块的Web应用程序。 首先,我们需要理解什么是Maven多模块项目。在Maven中,一个父项目可以包含多个子模块,每个子模块代表项目的一个独立...

    Maven Tomcat 插件

    Maven Tomcat插件是一个由Codehaus提供的开源工具,旨在简化使用Maven构建的Web应用程序在Apache Tomcat服务器上的部署过程。通过该插件,开发者可以轻松地在本地或远程Tomcat实例上部署、重新部署以及卸载Web应用...

    基于maven创建web项目

    基于maven创建web项目 maven是一种基于项目对象模型(Project Object Model,POM)的项目管理工具,由Apache软件基金会开发和维护。maven提供了一种标准化的方式来构建、打包和部署项目,它可以帮助开发者简化项目...

    使用Maven assembly打多个自定义包及War包简介

    本篇文章将深入探讨如何使用Maven Assembly插件来创建多个自定义包以及War包,这对于Java开发者来说尤其重要,因为它使得项目打包和分发变得更加方便。 Maven是一个强大的Java项目管理工具,它通过配置文件POM...

    Maven使用tomcat8-maven-plugin插件.docx

    Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-plugin 来实现 Maven 项目与 Tomcat 服务器的集成。下面我们将详细介绍如何使用 tomcat8-maven-plugin 插件。 tomcat8-maven-plugin 插件的...

    maven插件压缩包

    - `maven-war-plugin`:用于 Web 项目的打包。 - `maven-install-plugin`:将构建结果安装到本地仓库。 - `maven-deploy-plugin`:将项目部署到远程仓库。 ** 注意事项 ** - 确保你的 Maven 版本与压缩包中的插件...

    eclipse-maven2插件

    Eclipse Maven2插件是Java开发环境中不可或缺的一部分,它使得Eclipse IDE能够无缝地与Maven构建工具结合,极大地简化了项目的构建、...因此,对于任何Java开发者来说,熟练掌握Eclipse Maven2插件的使用是非常必要的。

    maven3插件

    5. **maven-war-plugin**:用于Web应用的打包。 6. **maven-install-plugin**:将项目安装到本地仓库。 7. **maven-deploy-plugin**:部署项目到远程仓库。 **Maven3插件的依赖管理:** Maven3插件的执行依赖于其...

    Maven学习必要插件

    - `maven-war-plugin`:打包Web应用为WAR文件。 - `maven-eclipse-plugin`:生成Eclipse项目文件,便于IDE中使用。 - `maven-site-plugin`:生成项目站点文档。 - `maven-dependency-plugin`:管理依赖,如分析...

    maven简单web实例

    Maven插件是实现特定构建任务的工具,例如,jetty-maven-plugin可以用于在开发过程中快速启动一个内置的Jetty服务器来运行Web应用。开发者可以通过在POM中配置插件来扩展Maven的功能。 ** Maven的Web应用程序构建 *...

    Myeclipse maven插件下载

    - Maven插件:Maven拥有丰富的插件库,可以扩展其功能,如`maven-jar-plugin`用于打包jar,`maven-war-plugin`用于打包war等。 - 集成持续集成工具:如Jenkins、Hudson等,可以与Maven完美结合,实现自动化构建和...

    Eclipse MAVEN离线插件

    Eclipse MAVEN离线插件是为开发人员提供的一种便捷方式,使得在没有网络连接或者网络环境不稳定的情况下,也能在Eclipse集成开发环境中使用Maven功能。Maven是一个强大的项目管理和构建工具,广泛用于Java应用的开发...

Global site tag (gtag.js) - Google Analytics