`
123003473
  • 浏览: 1059776 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    Maven3实战笔记(整合)

    总之,Maven3实战笔记(整合)不仅涵盖了Maven的基本原理和核心功能,还深入探讨了如何将Maven应用于实际项目中,解决常见的构建问题,提高构建效率和项目质量。对于Java开发者而言,熟练掌握Maven的使用技巧,将大大...

    Maven3实战笔记(全)

    《Maven3实战笔记(全)》是一本全面深入介绍Maven3的实践指南,由一位具有独特风格的作者撰写,以其风趣幽默的方式解析了Maven3的各种核心概念和使用技巧。这本书涵盖了从Maven的基础安装与配置,到复杂的仓库依赖...

    Maven3实战笔记.pdf

    标题中提及的“Maven3实战笔记”指向了Maven这款流行的Java项目管理和自动化构建工具的第三个主要版本。Maven自从引入以来,就极大地简化了Java项目的构建过程,提高了项目构建的标准化程度。它使用项目对象模型...

    Maven3实战笔记整合

    但是,我们可以根据标题和描述以及通用的Maven知识点,来构建一篇关于Maven3的实战笔记整合文章。 ### Maven3实战笔记整合 #### Maven简介 Apache Maven是一个项目管理和自动化构建的工具,主要服务于Java平台的...

    Maven3实战笔记08Maven反应堆

    ### Maven3实战笔记08——Maven反应堆:深度解析与实战应用 #### Maven反应堆的概念与作用 在深入探讨Maven反应堆之前,我们首先需要理解Maven项目是如何组织和构建的。Maven是一种自动化构建工具,它通过定义项目...

    Maven3实战笔记

    **Maven3实战笔记概述** Maven3是Apache软件基金会开发的一款项目管理和综合工具,它主要解决了Java项目构建过程中的依赖管理和项目信息管理问题。在Java开发领域,Maven3以其标准化的构建流程、强大的依赖管理和...

    Maven3实战视频教程(14集)

    课程目录: Maven3_01_maven概览 Maven3_02_maven安装的注意事项 Maven3_03_在eclipse中建立简单的项目 Maven3_04_maven的依赖特性 Maven3_05_maven的聚合和继承 Maven3_06_复习maven的基本...Maven3实战笔记 Maven配置

    Maven3实战.zip

    《Maven3实战》这本书是Java开发者不可或缺的参考资料,它深入浅出地介绍了Maven这一强大的项目管理和构建工具。在Java开发中,Maven3以其规范化的项目结构、自动化构建和依赖管理等功能,极大地提高了开发效率和...

    Maven3实战笔记04Maven的生命周期和插件

    ### Maven的生命周期和插件详解 ...通过定义清晰的构建阶段和绑定适当的插件目标,Maven能够自动化处理项目构建过程中的各种任务。理解Maven的生命周期和如何配置插件对于高效地使用Maven构建项目至关重要。

    Maven3实战笔记05仓库依赖解析与插件解析

    ### Maven3实战笔记05仓库依赖解析与插件解析 #### 一、Maven仓库依赖解析 Maven 是一个项目管理和构建工具,它通过一种称为“仓库依赖解析”的过程来管理项目的依赖关系。仓库依赖解析是指Maven如何查找并解决...

    Maven3实战笔记03Maven仓库

    Maven是Java项目自动化构建工具的一个标准,它通过一组生命周期(lifecycle)、构建阶段(phase)和目标(goal)来定义项目的构建过程。Maven的核心概念之一是仓库(Repository),仓库用于存储项目依赖的jar包、...

    maven笔记:maven-overlay-实战笔记

    【标题】:“maven笔记:maven-overlay-实战笔记” 在 Maven 的世界里,"overlay" 是一个重要的概念,主要用于Web项目的构建和部署。Maven overlay 技术允许你将多个项目的输出“重叠”在一起,形成一个新的项目,...

Global site tag (gtag.js) - Google Analytics