Maven根据Profile读取不同配置环境配置文件


原创 2016年07月09日 16:39:20






开发需求:在日常开发中,我们大多都会有开发环境(dev)、测试环境(test)、生产环境(product),不同环境的参数肯定不一样,我们需要在打包的时候,不同环境打不同当包,如果手动改,一方面效率低,容易出错,而且每次打包都改动,麻烦,所以Maven给我们提供了profile的配置


先贴一段代码,然后后面讲一些概念

1、首先需求就是有三个环境,每个环境的配置参数不一样,希望在打包的时候,不同环境用的配置数据不一样

idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_java


2、配置文件



[java] view plain copy



1. #这是dev环境配置  
2. jdbc_url=jdbc:mysql://127.0.0.1:3306/abcdev
3. jdbc_user=root  
4. jdbc_password=root



[java] view plain copy



1. #这是test环境配置  
2. jdbc_url=jdbc:mysql://192.168.1.180:3306/abcdev
3. jdbc_user=test_user  
4. jdbc_password=test_password


[java] view plain copy



1. #这是product环境配置  
2. jdbc_url=jdbc:mysql://10.6.8.30:3306/abcdev
3. jdbc_user=product_user  
4. jdbc_password=product_password



下面是spring 数据库连接配置中一段代码,其中数据库连接url, username, password用${key}这种方式



[html] view plain copy



1. <!-- 创建数据库连接 -->
2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
3. <!-- 数据库驱动 -->
4. <!-- 基本属性 url、user、password -->
5. <property name="url" value="${jdbc_url}" />
6. <property name="username" value="${jdbc_user}" />
7. <property name="password" value="${jdbc_password}" />
8.   
9. <!-- 配置初始化大小、最小、最大 -->
10. <property name="initialSize" value="1" />
11. <property name="minIdle" value="1" />
12. <property name="maxActive" value="20" />
13.   
14. <!-- 配置获取连接等待超时的时间 -->
15. <property name="maxWait" value="60000" />
16.   
17. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
18. <property name="timeBetweenEvictionRunsMillis" value="60000" />
19.   
20. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
21. <property name="minEvictableIdleTimeMillis" value="300000" />
22.   
23. <property name="validationQuery" value="SELECT 'x'" />
24. <property name="testWhileIdle" value="true" />
25. <property name="testOnBorrow" value="false" />
26. <property name="testOnReturn" value="false" />
27.   
28. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
29. <property name="poolPreparedStatements" value="true" />
30. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
31.   
32. <!-- 配置监控统计拦截的filters -->
33. <property name="filters" value="stat" />
34.   
35. </bean>


3、pom一些配置



[html] view plain copy



1. <profiles>
2. <profile>
3. <id>dev</id>
4. <properties>
5. <profiles.active>dev</profiles.active>
6. </properties>
7. <activation>
8. <activeByDefault>true</activeByDefault>
9. </activation>
10. <build>
11. <filters>
12. <filter>src/main/resources/dev.properties</filter>
13. </filters>
14. </build>
15. </profile>
16. <profile>
17. <id>test</id>
18. <properties>
19. <profiles.active>test</profiles.active>
20. </properties>
21. <build>
22. <filters>
23. <filter>src/main/resources/test.properties</filter>
24. </filters>
25. </build>
26. </profile>
27. <profile>
28. <id>prod</id>
29. <properties>
30. <profiles.active>prod</profiles.active>
31. </properties>
32. <build>
33. <filters>
34. <filter>src/main/resources/prod.properties</filter>
35. </filters>
36. </build>
37. </profile>
38. </profiles>


[html] view plain copy



1. <build>
2. <finalName>myweb</finalName>
3. <resources>
4. <resource>
5. <directory>src/main/resources</directory>
6. <includes>
7. <include>**/*</include>
8. </includes>
9. <filtering>true</filtering>
10. <excludes>
11. <exclude>application-text.xml</exclude>
12. <!--<exclude>src/main/resources/application-text.xml</exclude>-->
13. </excludes>
14. </resource>
15. </resources>
16. <!--<filters>-->
17. <!--<filter>src/main/resources/${profiles.active}.properties</filter>-->
18. <!--</filters>-->
19. </build>


4、最终,执行一个命令,mvn clean package ,我们看下编译后target下面的采用${key}有没有替换



idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_java_02


我们看到已经替换为dev的数据库连接,如果想打test的包呢,很简单: mvn clean package -Ptest

idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_数据库连接_03


好,到此为止,满足了我们的一个基本需求,我们来重点看看pom中的上面贴的配置


分析profile相关概念

idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_数据库连接_04

1、profiles:定义各个环境的变量配置,我上面的代码中有三个环境,所以配了3个profile

     <id>:profile的标示

    <properties>:自己定义的一些属性,可有可无,比如我配置的jdbc.url这些属性,如果不想通过properties定义这些,可以在改属性下面配置

    <filters>比较重要,指定当前profile环境下,属性文件路径;


分析build下属性

idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_bc_05


我们分析下<resource>下面的属性

<directory>: 配置那个目录下的文件通过${key}会被替换成属性值,resource目录下,我们一般放jdbc连接,或配置文件

<includes>:指定那个目录下那个文件

<filtering>:这个配置的意思是过滤上面指定属性文件中的占位符,占位符是${变量名称}这样的形式,maven会自动读取配置文件,然后解析其中的占位符,使用上面pom文件中定义的属性进行替换

<exclueds>:在resource目录下,有很多文件,但用些文件不希望替换,则可以通过<excluede>指定

<filters>:这里的filters与<profile>的filter意思一样,都是指属性文件地址,这个如果上面定义<profile>的时候指定了,这里就不需要了,但有些开发习惯是在<profile>不定义,然后在<build>里指定。


好了,只有简单配置这些,在使用maven命令的时候 mvn clean package -PprofileId,就可以根据不同环境打不同的包了




开发需求:在日常开发中,我们大多都会有开发环境(dev)、测试环境(test)、生产环境(product),不同环境的参数肯定不一样,我们需要在打包的时候,不同环境打不同当包,如果手动改,一方面效率低,容易出错,而且每次打包都改动,麻烦,所以Maven给我们提供了profile的配置


先贴一段代码,然后后面讲一些概念

1、首先需求就是有三个环境,每个环境的配置参数不一样,希望在打包的时候,不同环境用的配置数据不一样

idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_java


2、配置文件



[java] view plain copy



1. #这是dev环境配置  
2. jdbc_url=jdbc:mysql://127.0.0.1:3306/abcdev
3. jdbc_user=root  
4. jdbc_password=root

[java] view plain copy



1. #这是test环境配置  
2. jdbc_url=jdbc:mysql://192.168.1.180:3306/abcdev
3. jdbc_user=test_user  
4. jdbc_password=test_password

[java] view plain copy



1. #这是product环境配置  
2. jdbc_url=jdbc:mysql://10.6.8.30:3306/abcdev
3. jdbc_user=product_user  
4. jdbc_password=product_password

下面是spring 数据库连接配置中一段代码,其中数据库连接url, username, password用${key}这种方式



[html] view plain copy



1. <!-- 创建数据库连接 -->
2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
3. <!-- 数据库驱动 -->
4. <!-- 基本属性 url、user、password -->
5. <property name="url" value="${jdbc_url}" />
6. <property name="username" value="${jdbc_user}" />
7. <property name="password" value="${jdbc_password}" />
8.   
9. <!-- 配置初始化大小、最小、最大 -->
10. <property name="initialSize" value="1" />
11. <property name="minIdle" value="1" />
12. <property name="maxActive" value="20" />
13.   
14. <!-- 配置获取连接等待超时的时间 -->
15. <property name="maxWait" value="60000" />
16.   
17. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
18. <property name="timeBetweenEvictionRunsMillis" value="60000" />
19.   
20. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
21. <property name="minEvictableIdleTimeMillis" value="300000" />
22.   
23. <property name="validationQuery" value="SELECT 'x'" />
24. <property name="testWhileIdle" value="true" />
25. <property name="testOnBorrow" value="false" />
26. <property name="testOnReturn" value="false" />
27.   
28. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
29. <property name="poolPreparedStatements" value="true" />
30. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
31.   
32. <!-- 配置监控统计拦截的filters -->
33. <property name="filters" value="stat" />
34.   
35. </bean>


3、pom一些配置



[html] view plain copy


1. <profiles>
2. <profile>
3. <id>dev</id>
4. <properties>
5. <profiles.active>dev</profiles.active>
6. </properties>
7. <activation>
8. <activeByDefault>true</activeByDefault>
9. </activation>
10. <build>
11. <filters>
12. <filter>src/main/resources/dev.properties</filter>
13. </filters>
14. </build>
15. </profile>
16. <profile>
17. <id>test</id>
18. <properties>
19. <profiles.active>test</profiles.active>
20. </properties>
21. <build>
22. <filters>
23. <filter>src/main/resources/test.properties</filter>
24. </filters>
25. </build>
26. </profile>
27. <profile>
28. <id>prod</id>
29. <properties>
30. <profiles.active>prod</profiles.active>
31. </properties>
32. <build>
33. <filters>
34. <filter>src/main/resources/prod.properties</filter>
35. </filters>
36. </build>
37. </profile>
38. </profiles>


[html] view plain copy




    1. <build>
    2. <finalName>myweb</finalName>
    3. <resources>
    4. <resource>
    5. <directory>src/main/resources</directory>
    6. <includes>
    7. <include>**/*</include>
    8. </includes>
    9. <filtering>true</filtering>
    10. <excludes>
    11. <exclude>application-text.xml</exclude>
    12. <!--<exclude>src/main/resources/application-text.xml</exclude>-->
    13. </excludes>
    14. </resource>
    15. </resources>
    16. <!--<filters>-->
    17. <!--<filter>src/main/resources/${profiles.active}.properties</filter>-->
    18. <!--</filters>-->
    19. </build>



    4、最终,执行一个命令,mvn clean package ,我们看下编译后target下面的采用${key}有没有替换



    idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_java_02


    我们看到已经替换为dev的数据库连接,如果想打test的包呢,很简单: mvn clean package -Ptest

    idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_数据库连接_03


    好,到此为止,满足了我们的一个基本需求,我们来重点看看pom中的上面贴的配置


    分析profile相关概念

    idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_数据库连接_04

    1、profiles:定义各个环境的变量配置,我上面的代码中有三个环境,所以配了3个profile

         <id>:profile的标示

        <properties>:自己定义的一些属性,可有可无,比如我配置的jdbc.url这些属性,如果不想通过properties定义这些,可以在改属性下面配置

        <filters>比较重要,指定当前profile环境下,属性文件路径;


    分析build下属性

    idea 提示 检查您的 Maven 导入虚拟机选项打开 Maven 导入设置_bc_05


    我们分析下<resource>下面的属性

    <directory>: 配置那个目录下的文件通过${key}会被替换成属性值,resource目录下,我们一般放jdbc连接,或配置文件

    <includes>:指定那个目录下那个文件

    <filtering>:这个配置的意思是过滤上面指定属性文件中的占位符,占位符是${变量名称}这样的形式,maven会自动读取配置文件,然后解析其中的占位符,使用上面pom文件中定义的属性进行替换

    <exclueds>:在resource目录下,有很多文件,但用些文件不希望替换,则可以通过<excluede>指定

    <filters>:这里的filters与<profile>的filter意思一样,都是指属性文件地址,这个如果上面定义<profile>的时候指定了,这里就不需要了,但有些开发习惯是在<profile>不定义,然后在<build>里指定。


    好了,只有简单配置这些,在使用maven命令的时候 mvn clean package -PprofileId,就可以根据不同环境打不同的包了