Использование Ant для объединения двух разных файлов свойств - PullRequest
7 голосов
/ 05 января 2011

У меня есть файл свойств по умолчанию и некоторые файлы свойств, специфичные для развертывания, которые переопределяют определенные параметры по умолчанию в зависимости от среды развертывания. Я хотел бы, чтобы мой скрипт сборки Ant соединил два файла свойств (перезаписывая значения по умолчанию со значениями, специфичными для развертывания), а затем вывел полученные свойства в новый файл.

Я пытался сделать это так, но безуспешно:

<target depends="init" name="configure-target-environment">
    <filterset id="application-properties-filterset">
        <filtersfile file="${build.config.path}/${target.environment}/application.properties" />
    </filterset>

    <copy todir="${web-inf.path}/conf" file="${build.config.path}/application.properties" overwrite="true" failonerror="true" >
        <filterset refid="application-properties-filterset" />
    </copy>
</target>

Ответы [ 5 ]

4 голосов
/ 20 ноября 2015

Я сделал это так:

<property prefix="app.properties" file="custom.application.properties" />
<property prefix="app.properties" file="default.application.properties" />
<echoproperties destfile="application.properties">
   <propertyset>
      <propertyref prefix="app.properties"/>
      <mapper type="glob" from="app.properties.*" to="*"/>
   </propertyset>
</echoproperties>
2 голосов
/ 05 января 2011

Я понял это. Должен быть создан дополнительный файл свойств с каждым ключом / значением в следующем формате: mail.server.host = @ mail.server.host @ и т.д ...

Затем укажите этот файл шаблона в атрибуте файла в задаче. Также в наборе фильтров укажите несколько, наименее важный из которых указан первым.

Так бы это выглядело так:

<copy todir="${web-inf.path}/conf" file="${build.config.path}/template.application.properties" overwrite="true" failonerror="true" >
    <filterset refid="application-properties-filterset" />
</copy>

2 голосов
/ 05 января 2011

Возможно, вам стоит взглянуть на задачу муравья concat .

0 голосов
/ 23 февраля 2016

Остальные ответы в порядке, но мне нужен был один без этих ограничений:

  • Необходимость указания всех свойств в виде шаблонов с @ tokens @ (первый ответ)
  • Расширение собственности - например, У меня есть свойства, определенные как prop2 = $ {prop1}, которые будут расширены любым решением, которое загружает и отображает свойства
  • EchoProperties (@ user2500146) экранирует символы, такие как двоеточия, что раздражает свойства URL (это не ошибка Ant, это стандартные свойства Java, которые позволяют: вместо =)
  • Повторяющиеся свойства из решений на основе конкатов (это работает, потому что 2-е определение игнорируется, но я не хочу повторов

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

Вы можете использовать это дословно, но, возможно, захотите убрать операторы журнала или изменить их на уровень отладки, как только вы убедитесь

<!-- merge the main.properties.file with the default.properties.file
     into the output.properties.file (make sure these are defined) -->
<target name="merge">
    <!--Obscure enough prefix to ensure the right props are handled-->
    <property name="prefix" value="__MY_PREFIX__"/>
    <!--Load the main properties so we can tell if the default is needed-->
    <property prefix="${prefix}" file="${main.properties.file}"/>

    <!--Copy the main properties, then append the defaults selectively-->
    <copy file="${main.properties.file}" tofile="${output.properties.file}" overwrite="true"/>
    <concat destfile="${output.properties.file}" append="true">
        <fileset file="${default.properties.file}"/>
        <filterchain>
            <!--Filter out lines with properties that were already in the main properties -->
            <scriptfilter language="javascript"> <![CDATA[
            var line = self.getToken();
            project.log("line: " + line);
            var skipLine = false;
            // lines that do not define properties are concatenated
            if (line.indexOf("=") != -1) {
                // get the property name from the line
                var propName = line.substr(0, line.indexOf('='));
                project.log("line prop: " + propName);
                var loadedPropName = "__MY_PREFIX__" + propName;
                if (project.getProperty(loadedPropName) != null) {
                    project.log("prop has original: " + project.getProperty(loadedPropName));
                   // skip this line, the property is defined
                   skipLine = true;
                }
            }

            if (skipLine) {
                project.log("skipping line: " + line);
                self.setToken(null);
            }
            else {
                // else leave the line in as it was
                project.log("adding default line: " + line);
                self.setToken(line);
            }

]]> </scriptfilter>
        </filterchain>
    </concat>
</target>
0 голосов
/ 13 февраля 2013

Я лично использую это:

<copy todir="${web-inf.path}/conf" filtering="true">
  <fileset dir="${build.config.path}" includes="*.properties" /> 
  <filterset>
    <filtersfile file="application-properties-filterset" /> 
  </filterset>
</copy>
...