在开发过程中,对于存储在配置文件如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
接下来在resources下创建config文件夹,并创建dev、test文件夹,并在dev、test文件下分别创建config.properties文件,然后在各自环境下的config.properties文件中配置可变信息的值,添加了这些文件后,resources文件结构如下
点开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是自定义的,也可以换成其它名字,如
,这样之后,在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
完成之后,打开生成的jar包(使用解压缩软件直接打开,例如WinRaR),可以看到最外层的resources/config.properties
对比之前的
发现,${jdbc.url}已经被dev/config.properties 中key为jdbc.url的value替换了。
实际上,到这来profile中dev的作用已经不需要解释了,关键是mvn提供了-P这个参数,通过指定-P的,就可以在打包的时候指定到相应id的profile配置信息。如果不指定-P的值,则默认为(这里就是dev)
true
再来打test环境的包试试 mvn -P test package
接下来,在resources中添加一个mybatis-config.xml文件,看下配置
打包之后
发现一样可以。
4.打包别名
好吧,既然已经可以根据不同环境,可以将resources/config.properties可变的值抽离,并在打包的时候,可变部分替换到不同环境的值,那么很容易想到,将打成的包也区别开来,在pom.xml层级的build中设置
标签的值
打test包结果