通常,项目要在多个环境部署,每种环境都有各自的资源配置参数,比如:数据库连接、Redis服务器地址等等。
所以,各个环境打包出来的资源是不一样的,如果手动的修改,费时费力。我们可以利用MAVAN的**profiles**命令来自动化构建不同的部署包。
项目资源配置
一般情况下,项目引用的资源文件可以分为
公共资源文件
各自环境的差异化资源文件
在项目实际运行的时候,所引用的资源文件全部都在一个资源目录下,而存放的时候根据类型不同存放。
所以,构建部署包的时候,利用maven-resources-plugin插件和profiles命令将目标环境的差异化资源复制到公共资源位置,只需要把目标环境差异化的资源文件复制与公共资源一致的目录下即可。
在pom.xml中配置profiles
...devdevtrueproductproducttesttest...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
profiles节点中,定义了三种环境:dev(默认激活dev环境)、test、product。可以在各自的环境中添加需要的property值。
建立三个文件夹(dev,test,product)存放不同环境的各种资源。
maven标准目录中,提供了一个filters目录用于存放资源过滤文件。
src/main/filters/dev
src/main/filters/test
src/main/filters/product
1
2
3
请避免在resources目录中创建,因为resources目录中的文件默认情况下是不会被过滤的。
如果旧工程中已经在resources目录中创建不同环境的资源目录的时候,如:
src/main/resources/dev
src/main/resources/test
src/main/resources/product
1
2
3
这时候必须要在pom.xml中配置节点,用于排除各个环境的资源文件。这样,src/main/resources目录中就只包含有公共资源。
注:如果在eclipse中利用maven构建部署包,而eclipse默认会开启自动编译(Build Automatically),自动会把resources目录的全部文件编译到class的输出目录中,就算在pom.xml中配置节点用于过滤资源也是不起作用的。而我们不希望输出的部署包中存在不是目标环境的配置(有可能被泄露),所以推荐将不同环境的资源文件放于filters目录,而不是resources目录。
...src/main/resources/confsrc/main/resources/conf/devsrc/main/resources/conf/productsrc/main/resources/conf/testtrue...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
配置maven-resources-plugin插件
在构建WAR包的时候会经过资源文件处理阶段,maven-resources-plugin则用来处理资源文件。
配置maven-resources-plugin插件,针对不同环境通过命令行或者Profile传入属性的值,复制目标环境的资源,从而构建出不同的WAR包。
...org.apache.maven.pluginsmaven-resources-plugin2.6copy-resourcesvalidatecopy-resources${project.build.outputDirectory}truesrc/main/resources/conf/${package.environment}conffalse...