使用maven管理多环境配置信息打包

应用场景

        在开发过程中,对于存储在配置文件如properties、xml文件中的值,有时候是根据不同环境而不同的,例如数据库的地址,用户名和密码,调用其他系统的地址,秘钥,appId等等。笔者了解到,在实际开发过程中,有很多种方式可以实现,像在分布式系统的zookepper、spring cloud中的config组件,携程的apollo,在非分布式或者微服务框架中,在集成了spring中可以使用spring的profile机制,还可以使用maven profile + spring context:property-placeholder的方式。在非spring环境中,通过maven profile + filter的方式同样很简单。笔者这里记录了maven profile + filter的方式,下面使用这种方式演示如何来使用,并通过自定义的方式改变打包后的jar包名称。

实践过程

1. 创建一个maven工程
  在resources下创建config.properties,这个config.proerties就是环境实际使用的config
使用maven管理多环境配置信息打包_第1张图片
接下来在resources下创建config文件夹,并创建dev、test文件夹,并在dev、test文件下分别创建config.properties文件,然后在各自环境下的config.properties文件中配置可变信息的值,添加了这些文件后,resources文件结构如下
使用maven管理多环境配置信息打包_第2张图片
点开dev文件夹下的config.properties
在这里插入图片描述

注意这里的jdbc.url的意思是,后期去替换掉 resources/config.properties中的${jdbc.url},
所以需要确保两边的一致性,不然到时候打包出来resources/config.properties中的${jdbc.url}将不会被替换掉。

同理,点开test文件夹下的config.properties
在这里插入图片描述
好了,resources文件的准备完成,接下来需要在pom.xml文件中配置 profile属性,并接住filter的功能实现诸如${jdbc.url}${xxx}的替换。

2. 在maven的pom.xml配置

           首先在pom.xml中配置profiles,并配置好每个环境对应的profile,此样例中如下


	     
	    
	        dev
	        
	            dev
	        
            
	        
	            true
	        
	        
                
                    src/main/resources/config/dev/config.properties
                
            
	    
	    
	        test
	        
	            test
	        
	        
                
                    src/main/resources/config/test/config.properties
                
            
	    
	    
	        pro
	        
	            pro
	        
	    
	

在dev中id标签表示该环境(profile)的定位,看到后面就自然懂了,其中


   dev

中的environment是自定义的,也可以换成其它名字,如dev,这样之后,在pom.xml中就可以使用${environment}来表示dev这个值,如果是dev,则为${env},很容易理解。
       这里在每个环境(profile)中都定了了构建时指定用来过滤的文件,例如我们在dev环境中指定dev文件夹下的config.properties,这个的意思就是,在打包的时候如果指定了dev这个环境,则使用dev/config.properties去寻找匹配的${xxx},至于要寻找那些文件,则需要到另外的地方配置,见后面。


    
        src/main/resources/config/dev/config.properties
    

接下来需要配置,resources标签,这个标签,是在pom.xml级的build中加入


    
           src/main/resources
           
               config/**/*
           
           true
       

directory表示对这个目录下的文件处理,excludes表示排除掉哪些文件不处理,可以使用通配符,filtering设置为true,既呼应了profile中的filters。
因此,这里的整体意思是,根据打包时使用的不同环境,如(dev),使用dev/config.properties文件,在resource配置的directory目录下寻找符合要求的文件,如果这些文件中存在${xxx},并且已经在dev/config.properties中配置的值,则使用dev/config.properties中对应的值,替换到寻找到的${xxx}。接着往下看。

3.执行打包

好了,准备工作完成,接下来通过mvn打包,笔者喜欢手动敲命令的方式打包,在pom.xml所在的目录下,打开命令行终端(或者git bash),笔者就非常喜欢用 git bash。执行mvn clean后,执行mvn -P dev package,当然也可以跳过测试mvn -P dev package -Dmaven.test.skip=true
使用maven管理多环境配置信息打包_第3张图片
完成之后,打开生成的jar包(使用解压缩软件直接打开,例如WinRaR),可以看到最外层的resources/config.properties
使用maven管理多环境配置信息打包_第4张图片
对比之前的
使用maven管理多环境配置信息打包_第5张图片

发现,${jdbc.url}已经被dev/config.properties 中key为jdbc.url的value替换了。
         实际上,到这来profile中dev的作用已经不需要解释了,关键是mvn提供了-P这个参数,通过指定-P的,就可以在打包的时候指定到相应id的profile配置信息。如果不指定-P的值,则默认为(这里就是dev)


    true

再来打test环境的包试试 mvn -P test package
使用maven管理多环境配置信息打包_第6张图片

接下来,在resources中添加一个mybatis-config.xml文件,看下配置
使用maven管理多环境配置信息打包_第7张图片
打包之后
使用maven管理多环境配置信息打包_第8张图片
发现一样可以。

4.打包别名
          好吧,既然已经可以根据不同环境,可以将resources/config.properties可变的值抽离,并在打包的时候,可变部分替换到不同环境的值,那么很容易想到,将打成的包也区别开来,在pom.xml层级的build中设置标签的值
使用maven管理多环境配置信息打包_第9张图片
打test包结果
在这里插入图片描述

你可能感兴趣的:(开发工具,maven,profile,打包,java)