Maven3实战笔记13Maven Profile定制化构建

1. 前言
有时候我们开发的软件有不同的环境,开发阶段是开发环境,也就是我们这些研发人员平时使用的环境,大多数人开发还是在Windows下面吧,少数人连开发环境都需要在Linux或者Unix下进行,因为Java自身的跨平台性可能在哪个操作系统下开发差别不大,如果Java调用C/C++执行特定服务,就需要C/C++人员开发时最好和生产环境一样在Linux(而且版本一致)下进行研发,省得到时候测试的时候还得放到Linux下重新编译一遍。开发到了一定阶段后往往就是测试那边Team的加入了,功能测试、压力测试等等需要一套测试环境,而往往测试环境也分很多种情况,功能测试环境比较接近于开发环境,而压力测试环境往往接近于生产环境,甚至就是生产环境。面对这么多环境,以前我们可能都是手工进行配置,在不同环境下赋予不同的配置值。而手工配置就面临着可能出现错误,效率比较低等问题。
使用Maven的Profile配置,可以帮助我们灵活的进行构建项目,使之通过统一的定制化pom.xml配置就能让它适应不同的环境,如此一来显得软件更有应变性和适应性。
2. 屏蔽构建差异
笔者就以之前那个持久层模块作为基础,假如数据库在开发环境和测试环境有差异,怎么办,一般我们将数据库信息写到了配置文件properties中。
db.properties内容如下

1.db.Driver=${db.Driver}   
2.db.url=${db.url}
3.db.user=${db.user}
4.db.password=${db.password}


大家有可能奇怪,这里应该是具体的配置值了,是啊,配置值在pom.xml中
pom.xml片段如下

1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3. <modelVersion>4.0.0</modelVersion>
4. <artifactId>MavenAccount-persist</artifactId>
5. <packaging>jar</packaging>
6. <name>MavenAccount-persist</name>
7.
8. <parent>
9. <groupId>com.liuyan.account</groupId>
10. <artifactId>MavenAccount-aggregator</artifactId>
11. <version>0.0.1-SNAPSHOT</version>
12. <relativePath>../MavenAccount-aggregator/pom.xml</relativePath>
13. </parent>
14.
15. <dependencies>
16. ………………省略依赖
17. </dependencies>
18.
19. <build>
20. <resources>
21. <resource>
22. <directory>${project.basedir}/src/main/resource</directory>
23. <filtering>true</filtering>
24. </resource>
25. </resources>
26. </build>
27.
28. <profiles>
29. <profile>
30. <id>test1</id>
31. <activation>
32. <property>
33. <name>env</name>
34. <value>dev1</value>
35. </property>
36. </activation>
37. <properties>
38. <db.Driver>org.gjt.mm.mysql.Driver</db.Driver>
39. <db.url>jdbc:mysql://localhost:3306/uxian99</db.url>
40. <db.user>liuyan</db.user>
41. <db.password>111111</db.password>
42. </properties>
43. </profile>
44. <profile>
45. <id>test2</id>
46. <activation>
47. <property>
48. <name>env</name>
49. <value>dev2</value>
50. </property>
51. </activation>
52. <properties>
53. <db.Driver>com.mysql.jdbc.Driver</db.Driver>
54. <db.url>jdbc:mysql://192.168.1.109:3306/uxian99</db.url>
55. <db.user>dba</db.user>
56. <db.password>dba</db.password>
57. </properties>
58. </profile>
59. </profiles>
60.</project>


红色配置部分代表过滤资源配置文件,所有的资源文件在执行Maven构建命令时,pom中种种信息都和配置文件中的内容息息相关,需要让配置文件感应到pom内容。
蓝色部分就是定制化的prifile属性信息,其中配置了2个个性化配置信息。test1和test2。activation标签代表激活该特性的配置,这里所谓激活,其实就是让该个性化配置生效的意思。
下面我们写一个Java类简单读取配置文件

1.package util;   
2.
3.import java.io.IOException;
4.import java.io.InputStream;
5.import java.util.Properties;
6.
7.public class ReadConfig {
8.
9. public static String read() throws IOException {
10. InputStream in = ClassLoader.getSystemResourceAsStream("db.properties");
11. Properties p = new Properties();
12. p.load(in);
13. String dbDriver = (String) p.get("db.Driver");
14. String dburl = (String) p.get("db.url");
15. String dbuser = (String) p.get("db.user");
16. String dbpassword = (String) p.get("db.password");
17.
18. System.out.println(dbDriver);
19. System.out.println(dburl);
20. System.out.println(dbuser);
21. System.out.println(dbpassword);
22. return dbpassword;
23.
24. }
25.
26.}


之后为其写单元测试

1.package util;   
2.
3.import static org.junit.Assert.assertTrue;
4.
5.import java.io.IOException;
6.
7.import org.junit.Test;
8.
9.public class ReadConfigTest {
10.
11. @Test
12. public void testGenerateText() throws IOException {
13. String password = ReadConfig.read();
14. System.out.println(password);
15. assertTrue(password.equals("dba"));
16. }
17.
18.}



代码很简单,下面我们在控制台输入如下命令看看


Java代码
1.mvn clean package –Ptest2
mvn clean package –Ptest2 控制台输出结果如下


Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.com.mysql.jdbc.Driver
6.jdbc:mysql://192.168.1.109:3306/uxian99
7.dba
8.dba
9.dba
10.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec
11.
12.Results :
13.
14.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
com.mysql.jdbc.Driver
jdbc:mysql://192.168.1.109:3306/uxian99
dba
dba
dba
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 可以看到单元测试用例结果是test2的配置信息,而构建后的配置文件内容如下db.properties


Java代码
1.db.Driver=com.mysql.jdbc.Driver
2.db.url=jdbc:mysql://192.168.1.109:3306/uxian99
3.db.user=dba
4.db.password=dba
db.Driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.109:3306/uxian99
db.user=dba
db.password=dba 可以看到,构建后的配置文件内容不再是${db.Driver}这种临时变量信息,而是被pom文件替换后的实际配置值。
不更改任何代码,在控制台输入如下

Java代码
1.mvn clean package -Denv=dev1
mvn clean package -Denv=dev1 结果如下表示profile的test1特性被激活了,测试结果与预期预料不符合。激活profile有以上两种方式,显示指定配置参数方式、系统属性=某些具体值的时候。还有在用户级setting.xml或者全局级setting.xml文件中配置默认信息的。不过这种方式不是很赞成。因为配置了此信息意味着只能在自己本机环境中得到正确的相应,项目打包,发布后并不会保存到自身的pom文件中,那么别人构建的时候也许会报错。所以尽量在项目级别的pom.xml中配置相关定制化信息。
Java代码
1.-------------------------------------------------------
2. T E S T S
3.-------------------------------------------------------
4.Running util.ReadConfigTest
5.org.gjt.mm.mysql.Driver
6.jdbc:mysql://localhost:3306/uxian99
7.liuyan
8.111111
9.111111
10.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
11.ILURE!
12.
13.Results :
14.
15.Failed tests:
16. testGenerateText(util.ReadConfigTest)
17.
18.Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running util.ReadConfigTest
org.gjt.mm.mysql.Driver
jdbc:mysql://localhost:3306/uxian99
liuyan
111111
111111
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FA
ILURE!

Results :

Failed tests:
testGenerateText(util.ReadConfigTest)

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

3. 总结
Profile是轮廓;外形;外观;形象; 侧面(像),侧影的意思,我觉得叫做个性化配置更好。个性化配置还可以过滤web项目资源、集成测试。因为网上有相关的资源,就不总结了。多数应用还是屏蔽个性化构建的差异。


【转载地址】http://suhuanzheng7784877.iteye.com/blog/1100412
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值