Maven适配多种运行环境的打包方案

摘要:
从开发到部署,项目将经历多个操作环境,如开发环境、测试环境和生产环境。不同环境中项目的配置文件通常不同,通常包括数据库连接配置。我们当然不想在每次部署和打包之前修改配置文件以适应环境。Maven的配置文件和资源过滤可用于根据环境设置自动调整配置文件。创建一个Maven项目,并在src/main/resources,${log4j.path},${datasource.jdbcUrl},${data source.user},${datasource.paassword}是包装时根据目标环境需要更换的内容。接下来,在pom中配置替换规则。xml:[html]viewplaincopyprint?

项目从开发到部署会历经多个运行环境,如开发环境、测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置。我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用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文件等。合理运用可以灵活的应对各种差异环境要求。

免责声明:文章转载自《Maven适配多种运行环境的打包方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mybatis中 ResultMap的collection配置一对多使用详解黑马程序员JAVA基础Java 集合之Collections 工具类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

log4j配置

虽然现在大多数项目都趋向于slf4j,但是在开发中log4j简单的配置还是有使用之地。基本一个log4j.properties就行了,查看SQL语句的执行等等,非常nice。 首先是引用jar包 <!--log4j--> <dependency> <groupId>lo...

Logback 也爆雷了,惊爆了。。。

Logback 也爆雷了 Log4j2 漏洞最新进展: Log4j 2.3.1 发布!又是什么鬼?? Log4j2 核弹级漏洞刚结束没几天,Logback 其实也爆雷了,这你能信?? 栈长在上篇文章提到,因 Log4j2 漏洞的反复无常,导致某些公司已经切换到 Logback 了,如果这也是你们公司的决定,请在文章下面评论区留言。 可令栈长万万想不到的是,...

ubuntu下log4cxx安装使用

需要安装log4cxx,安装的过程中可是充满了坎坷。。。最大的问题是在make log4cxx时,总是报undefined XML什么什么的错误,查了一下也没解决了,然后把apr-utils删了重新装了一下就好了。。 log4cxx现在是apache的一个项目,用来记录日志。看名字就知道,是给c++使用的。 环境(在以下2个环境中进行验证测试): gcc...

Java日志框架logback剖析

Logback和log4j非常相似,优点如下: 1、更快的实现 Logback的内核重写,在一些关键执行路径上性能提升10倍以上。同时,初始化内存加载也更小。 2、非常充分的测试 Logback经过数年的测试,这是简单重要的原因选择logback而不是log4j。 3、Logback-classic非常自然实现了SLF4j 因为logback-classi...

spring配置log4j

1.引入log4j-xxx.jar包,buildpath. 2.在项目的根目录下新建resources名的文件夹,注意是source folder,并新建log4j.properties文件 3.在log4j.properties中配置: #LOG_DIR:/usr/local/.../logs LOG_DIR = E:\logs #Level:ER...

zlog 使用手册

zlog1使用手册 难易 著23 Contents Chapter 1  zlog是什么? 1.1  兼容性说明 1.2  zlog 1.2 发布说明 Chapter 2  zlog不是什么? Chapter 3  Hello World 3.1  编译和安装zlog 3.2  应用程序调用和链接zlog 3.3  Hello World...