Las otras respuestas están bien, pero necesitaba una sin estas limitaciones:
- La necesidad de que todas las propiedades que se especifican como plantillas con @ fichas @ (primera respuesta) de expansión
- Propiedad - p.ej Tengo propiedades definidas como prop2 = $ {prop1} que se expandirán con cualquier solución que cargue y echos las propiedades
- EchoProperties (@ user2500146) escapa caracteres como dos puntos que es molesto para las propiedades de URL (no es culpa de Ant, eso es propiedades estándar de Java , que permiten: en lugar de =)
- propiedades repetidas de soluciones basadas en concat (esto funciona, ya que la segunda definición se ignora, pero yo no quería que se repite
al final tuve que recurrir javascript en un filtro, pero mi solución trae propiedades predeterminadas si y solo si no están definidas en el archivo de propiedades principal. Funciona al cargar las principales propiedades wi un prefijo oscuro, y luego copiarlo en el destino, luego concat'ing las propiedades predeterminadas mientras filtra las propiedades predeterminadas que se cargaron en el primer paso.
Se puede utilizar esta palabra por palabra, pero probablemente tendrá que tomar las declaraciones de registro o cambiarlos a nivel de depuración, una vez que esté convencido de
<!-- 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>
Marque su propia respuesta como correcta, ya que funciona perfectamente. –