使用maven-war-plugin插件进行war包的合并

 

 

转自:http://jdonee.iteye.com/blog/794226

差不多是http://maven.apache.org/plugins-archives/maven-war-plugin-2.1.1/overlays.html

http://maven.apache.org/plugins/maven-war-plugin/overlays.html

这两篇文章的翻译

 

     在一个大项目中拆分maven工程时,很有可能会把js、css、jsp等文件放在不同的工程里(根据业务划分  的模块)。因为如果都集中在一个maven webapp中,那么这个webapp就会过大,而且在业务上显得比较松散

       但是这些持有js、css、jsp的maven工程,如果packaging设置为jar是不合适的,因为外围要读取内部的这些文件就会很困难。在这种场景下,一个很自然的想法就是打成war包,然后用某种方式将多个war包归并起来,得到最终的war包

本章给你介绍Maven WAR Plugin的,你可称之为“重迭”或者“覆盖”。

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下声明它作为当前项目的依赖:

  …
 
   
      com.example.projects
      documentedprojectdependency
      1.0-SNAPSHOT
      war
      runtime
   

    …
 

  …

接下来,我们查看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插件的以往版本中,配置并不总是必须的。如果你觉得使用默认设置能很好满足要求,那就继续这么做。但是如果你需要更多的控制,那么你就得好好看看下面的部分了。

元素包含有下列子元素:

  • 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文件:

  …
 
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
         
           
              com.example.projects
              documentedprojectdependency
             
                WEB-INF/classes/images/sampleimage-dependency.jpg
             

           

         

       

     

   

 

  …

4、Overlays的打包

Overlays采用第一直达者优先的策略(因此,如果一个文件被某一个副本覆盖过,则它不会被另一个副本继续覆盖)。

Overlays的应用步骤依照它们在配置的顺序。如果没有指定配置,那么它们的依赖关系将按照POM定义的顺序来调用(警告:这有很多的不确定性,特别是在您使用传递性依赖来覆盖的时候)。如果当前项目运用了复合覆盖的情况(即同时包含配置型覆盖和非配置型覆盖),非配置型覆盖应用于配置型覆盖之后。

默认情况下,该项目源(亦称当前构建)遵循按pom.xml上下文中依赖的先后顺序进行追加(如任何覆盖元素已被应用之前)。当前构建定义了一个没有groupId和artifactId的特殊覆盖方式。如果overlays需要应用第一(直达者优先)原则,那么就只需简单地配置当前构建在这些覆盖之后。

例如,假设groupid为com.example.projects的my-webapp是当前项目的一个依赖,而你需要首先应用它,操作如下:

  …
 
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
         
           
              com.example.projects
              my-webapp
           

           
             
           

         

       

     

   

 

  …

注意:在上述情况下,没有配置在元素的其它WAR依赖都会应用在当前构建之后。

如果你想要执行一项更好更精细的覆盖策略,overlays能通过不同的includes/exclude元素进行多重打包。例如,我想要在当前项目中使用my-webapp的 index.jsp覆盖文件,但是my-webapp的其它文件还是按照常规方式来控制,鉴于此,我们必须要为 my-webapp定义两个覆盖配置:

  …
 
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
         
           
              my-webapp-index.jsp
              com.example.projects
              my-webapp
             
                index.jsp
             

           

           
              
           


              my-webapp
              com.example.projects
              my-webapp
           

         
       
     
   
 
  …

 5、Overlay全局设置

下面的设置能指定全局性的Overlay和修改所有Overlay的应用方式。

  • dependentWarIncludes -  设置此包含默认值适用于所有的overlay。没有指定includes元素的overlay都将继承此默认设置。

    …
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
          **/IncludeME,**/images
       

      

   

    …

  • dependentWarExcludes -  设置此排除默认值适用于所有的overlay。没有指定excludes元素的overlay都将继承此默认设置。

    …
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
          WEB-INF/web.xml,index.*
       

      

   

    …

  • workDirectory – 设置overlays临时提取的目录。

    …
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
         
          /tmp/extract_here
       

      

   

    …

  • useCache – 设置true时,能启用webapp架构缓存。默认值:false。

    …
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
          true
       

      

   

    …

6、ZIP依赖的覆盖

要想使一个zip依赖作为一个覆盖,你必须在插件配置中指定它。例如你要在Web应用的scripts目录下通过一个zip覆盖注入内容,操作如下:

    …
   
     
        org.apache.maven.plugins
        maven-war-plugin
        2.1
       
         
           
              zipGroupId
              zipArtifactId
              zip
              scripts
           

         

       

     

   

    …

你可能感兴趣的:(maven)