Замена всех токенов на основе файла свойств с помощью ANT

Я уверен, что это простой вопрос для ответа, и я видел, как он попросил, чтобы просто не было твердых ответов.

У меня есть несколько файлов свойств, которые используются для разных сред, например xxxx-dev, xxxx-test, xxxx-live

Файлы свойств содержат что-то вроде:

server.name=dummy_server_name
server.ip=127.0.0.1

Файлы шаблонов, которые они используют, выглядят примерно так:

<...>
   <server name="@[email protected]" ip="@[email protected]"/>
</...>

Вышеприведенный пример является действительно примитивным, но им интересно, есть ли способ просто сказать ANT заменить все токены на основе файла свойств, вместо того, чтобы жестко кодировать линию токена для каждого... т.е.

<replacetokens>
   <token key="server.name" value="${server.name}"/>
   <token key="server.ip" value="${server.ip}"/>
</replacetokens>

Любая помощь будет замечательной!

Ответы

Ответ 1

Вы можете указать файл свойств, из которого можно прочитать список токенов для 'replace' task, используя replacefilterfile:

<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>

Ответ 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 @[email protected]=value -->
    <replaceregexp file="${temp.replace}" match="([^=]*)=" replace="@\[email protected]=" byline="true" />

    <!-- copy template and replace properties -->
    <copy file="template.txt" tofile="replaced.txt" />
    <replace file="replaced.txt" replacefilterfile="${temp.replace}" />

</target>

с шаблоном

ANT home @[email protected]
ANT version @[email protected]
server name @[email protected] ip @[email protected]

это приводит к

ANT home /usr/share/ant
ANT version 1.7
server name dummy_server_name ip 127.0.0.1