首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-07-18 
使用Maven WAR插件实现多Web应用间的重迭运用一、引言??????? ?Q群的朋友问道可不可以在多个Web应用间合并

使用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

            <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>

热点排行