Replace2是我写的一个ant 任务,ant内置的有一个replace任务,用于替换指定文件里的某些内容,如log4j.properties里:
log4j.appender.Y.File =@@Log.FilePath@@
replace任务可以读取一个属性配置文件,如下内容
Log.FilePath = E:\temp\info.log
WebService = http://10.1.120.133:7001/XXX/BookService
这个Replace 任务有一个用法就是解决多环境部署,也就是说,如果你现在有一个测试系统,又有一个开发系统,它们连着不同的地址的数据库,不同地址的 WebService,以及不同地址的FTP服务,那么,你在部署的时候必须将这些内容写到配置文件里,手工写比较繁琐,而且容易出错,一个好的办法就是采用replace任务,只需要写一个testenv.properties,再写一个devlopenv.properties,里面各包含了目标环境的配置信息,然后运行此,去替换可能的配置文件,如log4j.properties,hibernate.cfg.xml 等等。如果还是很不好理解的话,可以参考http://ant.apache.org/manual/CoreTasks/replace.html,了解它的用法后再看下文,否则更不好理解
Replace应用于多环境部署固然可以,不过却忽略了开发的需要,想想看,如果log4j.appender.Y.File =@@Log.FilePath@@那么你在调试程序的时候必然出错。再比如,数据源的配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url">
<value>@@JBDC.URL@@</value>
</property>
<property name="username">
<value>@@JBDC.USER@@</value>
</property>
<property name="password">
<value>@@JBDC.PWD@@</value>
</property>
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
</bean>
那这也没有办法让程序运行。
Replace2 是我写的一个ant task,其目的正是兼顾多环境部署以及开发需要。用法同Replace,不同的地方是在于配置文件跟正常文件一样,并且在上方多了一行注释如下;# log4j.appender.Y.File = @@Log.FilePath@@ log4j.appender.Y.File = E:\temp\info.log
Replace2任务将根据注释里的内容替换紧接下一行的内容,如果env.properties 里的内容有Log.FilePath=/opt/xxx/data/logs/info.log 那么替换后的文件内容就是
# log4j.appender.Y.File = @@Log.FilePath@@ log4j.appender.Y.File = /opt/xxx/data/logs/info.log.
这样,即不影响正常开发,又会在部署,特别是多环境部署的时候起动作用。
下面是使用方法:
<target name="use" description="Use the Task" depends="jar">
<taskdef name="replace2" classname="com.xxx.ant.Replace2" classpath="${replace2.jar}"/>
<replace2 token="##" propertisFile="${basedir}/env.properties">
<filePath path="${basedir}/log4j.properties"/>
<filePath path="${webapp}/WEB-INFO/web.xml"/>
<filePath path="${build.home}/hibernate.cfg.xml"/>
<filePath path="${src}/com/xxx/Gloable.java"/>
</replace2>
</target>
代码在google上http://code.google.com/p/replace2/
预览代码http://code.google.com/p/replace2/source/browse/