利用assembly插件分环境打包配置文件

首先, 郑重的吐槽下度娘, 能找到的资料, 都是说针对打包tar.gz的, 找了好一会儿, 才找到针对war包.
开始并不顺利, 因为在父子模块的场景下, 有war,有jar. 最后发现打包的lib里包含war包. 这样不是重复打包吗, 而且, 并不能打成标准war包结构.

好啦, 现在上正解.

工程结构:

parent          //pom
    | common   //jar
    | dao      //jar
    | web      //war

针对中这种结构的工程, 网上的tar.gz的做法并不适用. 主要是: 1)会将web模块的war包打进lib文件中; 2)目录结构不是war包应有的结构. 前者是因为maven自带的编译打包工具会先执行打包操作, 这样轮到assembly打包时会将打好的war包打进lib文件夹中.

针对上文的工程结构, 需要:

  1. parentpom中统一配置自带的编译插件. 主要是指定编译的jdk版本.(否则默认会使用1.5的. 不会的需要补充学习下).
  2. jar模块如果需要分环境打包配置文件, 则不需要任何多余的配置, 使用的默认的jar打包即可.
  3. web模块是重点. 下文的配置都是针对web的配置. 通常web工程更多的需要分环境打包配置文件.

web配置文件结构

利用assembly插件分环境打包配置文件_第1张图片
1527171764196.png

我这里的思路是: resources下可以放置每个环境都需要的公共配置文件. 分环境的放在./src/main/assembly/下.

1 web模块的pom.xml中的profiles配置


        
        
            dev
            
                true
                
                    env
                    dev
                
            

            
            
                dev
            

            
                
                    
                        maven-assembly-plugin
                        
                            
                            
                                ${basedir}/src/main/assembly/assembly.xml
                            
                            ${project.artifactId}-${project.version}
                            ${project.build.directory}
                        
                    
                
            

        
        
        
            test
            
                
                    env
                    test
                
            

            
                test
            

            
                
                    
                        maven-assembly-plugin
                        
                            
                            
                                ${basedir}/src/main/assembly/assembly.xml
                            
                            
                            ${project.artifactId}-${project.version}
                            
                            ${project.build.directory}
                        
                    
                
            
        
    

    

2 web模块的pom.xml中引入assembly插件


        
            
            
                org.apache.maven.plugins
                maven-jar-plugin
                2.5
                
                    
                        true
                    
                
            

            
                org.apache.maven.plugins
                maven-assembly-plugin
                
                2.2.1
                
                    
                        assemble
                        
                            single
                        
                        
                        package
                    
                
                
                    false 
                    false
                
            
        
    

3 配置定制assembly.xml


    web
    
        war
        
        dir
    
    false
    
    
        
            ${project.build.outputDirectory}
            WEB-INF/classes
        
        
        
        
            ${project.basedir}/src/main/assembly/${env}
            WEB-INF/classes
        
        
        
            ${project.basedir}/src/main/resources
            WEB-INF/classes
        
        
        
            ${project.basedir}/src/main/webapp
            /
        
    


    
        
        
            WEB-INF/lib
            
            
                
            
            false
        
    


这里采用的方案是, 不同环境公用同一个assembly.xml文件.

4 执行打包的命令

各环境对应的命令:

mvn clean package
mvn clean package -P dev
mvn clean package -P test
mvn clean package -P prod

后记

分环境打包的分支控制策略有两种:

  1. 通过profile配置不同的环境下的配置, 然后打包的时候通过参数-P 环境id定位到对应profile, 就会执行该profile下的所有配置, 包括自定义的properties(这里的propertiesprofile外层的效果一样). 本文采用的就是这个思路.
    这种方案的好处是, 可以方便的定义默认打包环境.

  2. 不同环境的配置文件分别放在不同的路径下, 打包配置中用${env}动态执行路径, 然后打包时带上参数: -Denv=环境名称, 即动态手动指定环境名, 定位到对应路径下的配置文件. 这种方案看似简单好实施, 但有个缺陷就是不方便执行默认打包环境.

最后, 再次重复一个坑点:
下图中两种property效果完全不同的, 上面的我完全不知道有什么鸟用, 下面的才是关键.

利用assembly插件分环境打包配置文件_第2张图片
properties

你可能感兴趣的:(利用assembly插件分环境打包配置文件)