Остальные ответы в порядке, но мне нужен был один без этих ограничений:
- Необходимость указания всех свойств в виде шаблонов с @ 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>