我很确定这是一个简单的问题,我已经看过它之前没有可靠的答案。
我有几个用于不同环境的属性文件,即xxxx-dev,xxxx-test,xxxx-live
属性文件包含以下内容:
server.name=dummy_server_name
server.ip=127.0.0.1
我使用的模板文件类似于:
<...>
<server name="@server.name@" ip="@server.ip@"/>
</...>
以上是一个非常原始的例子,但我想知道是否有办法告诉ANT基于属性文件替换所有令牌,而不是必须为每个令牌行硬编码...即
<replacetokens>
<token key="server.name" value="${server.name}"/>
<token key="server.ip" value="${server.ip}"/>
</replacetokens>
任何帮助都会很棒!
答案 0 :(得分:16)
您可以使用replacefilterfile
指定要从中读取'replace' task令牌列表的属性文件:
<replace file="input.txt" replacefilterfile="properties.txt"/>
同样,在过滤器链中,您可以使用'replacetokens' propertyfile
:
这会处理每个属性文件 在sample.properties中输入一个 令牌/密钥对:
<loadfile srcfile="${src.file}" property="${src.file.replaced}">
<filterchain>
<filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
<param type="propertiesfile" value="sample.properties"/>
</filterreader>
</filterchain>
</loadfile>
答案 1 :(得分:2)
随着替换任务本身我错过了令牌周围的@分界符,所以我提出了以下解决方案。您可以在模板文件中使用任何ant属性
<project name="replace" default="replace">
<property file="build.properties" />
<target name="replace">
<!-- create temp file with properties -->
<tempfile property="temp.replace" suffix=".properties"/>
<echoproperties destfile="${temp.replace}" />
<!-- replace name=value with @name@=value -->
<replaceregexp file="${temp.replace}" match="([^=]*)=" replace="@\1@=" byline="true" />
<!-- copy template and replace properties -->
<copy file="template.txt" tofile="replaced.txt" />
<replace file="replaced.txt" replacefilterfile="${temp.replace}" />
</target>
带有模板
ANT home @ant.home@
ANT version @ant.java.version@
server name @server.name@ ip @server.ip@
这导致
ANT home /usr/share/ant
ANT version 1.7
server name dummy_server_name ip 127.0.0.1
答案 2 :(得分:0)
使用fileset表单ant-contrib
可以读取令牌表单属性文件,并将多个令牌替换为多个文件。
<project name="MyProject" default="replaceToklens" basedir=".">
<property name="profilesProperties" value="${basedir}/environment.properties" />
<property name="build.dir" location="build"/>
<!-- File to Load/ Accessable -->
<property file="${profilesProperties}" />
<target name="replaceToklens">
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="${basedir}/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<mkdir dir="${build.dir}"/>
<filter filtersfile="${profilesProperties}" />
<copy todir="${build.dir}" filtering="true" overwrite="true">
<fileset dir="${basedir}"> <!-- target/MyProject -->
<include name="*.xml" />
<exclude name="build.xml" />
</fileset>
</copy>
</target>
</project>
文件夹结构:
ANT
\_ build.xml
\_ environment.properties
\_ server.xml
\_ build
\_ server.xml [replaced with token value]
要替换单个托克,请执行以下操作:
<replace file="build/server.xml" token="@keyName@" value="${keyValue}" />