zoukankan      html  css  js  c++  java
  • Maven适配多种运行环境的打包方案

    项目从开发到部署会历经多个运行环境,如开发环境、测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置。我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用Maven的Profile和资源过滤,可以实现自动按环境设置调整配置文件。

    新建一个Maven项目,在src/main/resources添加两个配置文件。

    log4j.xml

    [html] view plain copy
     
     print?
    1. <log4j:configuration>  
    2.     <appender name="common" class="org.apache.log4j.DailyRollingFileAppender">  
    3.         <param name="File" value="${log4j.path}/debug.log" />  
    4.         <param name="Append" value="true" />  
    5.         <layout class="org.apache.log4j.PatternLayout">  
    6.             <param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n" />  
    7.         </layout>  
    8.     </appender>  
    9.     <root>         
    10.         <priority value ="info"/>  
    11.         <appender-ref ref="common"/>  
    12.     </root>  
    13. </log4j:configuration>  

    datasource.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
    2.     destroy-method="close">  
    3.     <property name="driverClass" value="com.mysql.jdbc.Driver" />  
    4.     <property name="jdbcUrl" value="${datasource.jdbcUrl}" />  
    5.     <property name="user" value="${datasource.user}" />  
    6.     <property name="password" value="${datasource.password}" />  
    7.     <property name="minPoolSize" value="3" />  
    8.     <property name="maxPoolSize" value="100" />  
    9. </bean>  

    其中,${log4j.path}、${datasource.jdbcUrl}、${datasource.user}、${datasource.password}是打包时需要按目标环境替换的内容。

    接下来在pom.xml中配置替换规则:

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <profiles>  
    2.     <profile>  
    3.         <id>product</id>  
    4.         <activation>  
    5.             <activeByDefault>false</activeByDefault>  
    6.         </activation>  
    7.         <properties>  
    8.             <log4j.path>/opt/logs</log4j.path>  
    9.             <datasource.jdbcUrl>jdbc:mysql://localhost:3306/product?useUnicode=true&amp;amp;characterEncoding=UTF8</datasource.jdbcUrl>  
    10.             <datasource.user>someuser</datasource.user>  
    11.             <datasource.password>somepwd</datasource.password>  
    12.         </properties>  
    13.     </profile>  
    14.     <profile>  
    15.         <id>dev</id>  
    16.         <activation>  
    17.             <activeByDefault>true</activeByDefault>  
    18.         </activation>  
    19.         <properties>  
    20.             <log4j.path>D:/Logs</log4j.path>  
    21.             <datasource.jdbcUrl>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;amp;characterEncoding=UTF8</datasource.jdbcUrl>  
    22.             <datasource.user>root</datasource.user>  
    23.             <datasource.password>123456</datasource.password>  
    24.         </properties>  
    25.     </profile>  
    26. </profiles>  
    27. <build>  
    28.     <resources>  
    29.         <resource>  
    30.             <directory>src/main/resources</directory>  
    31.             <filtering>true</filtering>  
    32.         </resource>  
    33.     </resources>  
    34. </build>  

    在profiles中定义了id分别为product和dev的两套profile,profile dev设置为默认激活,每个profile配置了一组properties,其中的4个元素名称分别对应log4j.xml和datasource.xml中的红字部分。

    resources中定义了打包前扫描的文件夹,这里指定针对src/main/resources目录下的文件进行扫描并替换。

    下面来做测试,首先执行

    mvn clean package

    这里没有指定激活的profile,将按默认激活规则即dev环境生成配置。查看生成的jar文件中的配置文件内容

    log4j.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <log4j:configuration>  
    2.     <appender name="common" class="org.apache.log4j.DailyRollingFileAppender">  
    3.         <param name="File" value="D:/Logs/debug.log" />  
    4.         <param name="Append" value="true" />  
    5.         <layout class="org.apache.log4j.PatternLayout">  
    6.             <param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n" />  
    7.         </layout>  
    8.     </appender>  
    9.     <root>         
    10.         <priority value ="info"/>  
    11.         <appender-ref ref="common"/>  
    12.     </root>  
    13. </log4j:configuration>  

    datasource.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
    2.     destroy-method="close">  
    3.     <property name="driverClass" value="com.mysql.jdbc.Driver" />  
    4.     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8" />  
    5.     <property name="user" value="root" />  
    6.     <property name="password" value="123456" />  
    7.     <property name="minPoolSize" value="3" />  
    8.     <property name="maxPoolSize" value="100" />  
    9. </bean>  

    改为按product环境打包,执行

    mvn clean package -P product

    查看生成的jar文件中的配置文件内容

    log4j.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <log4j:configuration>  
    2.     <appender name="common" class="org.apache.log4j.DailyRollingFileAppender">  
    3.         <param name="File" value="/opt/logs/debug.log" />  
    4.         <param name="Append" value="true" />  
    5.         <layout class="org.apache.log4j.PatternLayout">  
    6.             <param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n" />  
    7.         </layout>  
    8.     </appender>  
    9.     <root>         
    10.         <priority value ="info"/>  
    11.         <appender-ref ref="common"/>  
    12.     </root>  
    13. </log4j:configuration>  

    datasource.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
    2.     destroy-method="close">  
    3.     <property name="driverClass" value="com.mysql.jdbc.Driver" />  
    4.     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/product?useUnicode=true&amp;characterEncoding=UTF8" />  
    5.     <property name="user" value="someuser" />  
    6.     <property name="password" value="somepwd" />  
    7.     <property name="minPoolSize" value="3" />  
    8.     <property name="maxPoolSize" value="100" />  
    9. </bean>  

    除了上面演示中的命令行指定激活和默认激活外,Maven还支持依据操作系统、文件是否存在、系统属性值等条件激活;匹配规则上可以指定多个目录及对目录指定是否开启资源过滤,甚至允许替换Web资源如图片、css文件等。合理运用可以灵活的应对各种差异环境要求。

  • 相关阅读:
    深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
    深入理解计算机系统(3.1)---走进汇编的世界
    linux下的usb抓包方法
    Linux中查看系统资源占用情况的命令
    中药介绍
    shell中的for循环用法详解
    Linux上shell脚本date的用法
    linux下的shell运算(加、减、乘、除)
    [linux time命令学习篇] time 统计命令执行的时间
    一文简述多种强化学习算法,重要概念和术语一览
  • 原文地址:https://www.cnblogs.com/sa-dan/p/6836988.html
Copyright © 2011-2022 走看看