Le altre risposte sono a posto, ma ho bisogno di uno senza queste limitazioni:
- La necessità di tutte le proprietà da specificare come modelli con @ gettoni @ (prima risposta) di espansione
- Proprietà - per esempio Ho proprietà definite come prop2 = $ {prop1} che verranno espanse da qualsiasi soluzione che carichi e echi le proprietà
- EchoProperties (@ user2500146) esegue l'escape di caratteri come i due punti, il che è fastidioso per le proprietà URL (non è colpa di Ant, è una proprietà Java standard , che permettono: al posto di =)
- proprietà ripetute soluzioni concat-based (questo funziona, perché la seconda definizione è ignorato, ma non volevo ripete
alla fine ho dovuto ricorrere in javascript in un filtro, ma la mia soluzione introduce proprietà predefinite se e solo se non sono definite nel file delle proprietà principali. Funziona caricando le proprietà principali con un prefisso oscuro, quindi copiandolo alla destinazione, quindi concatenando le proprietà predefinite mentre esclude le proprietà predefinite che sono state caricate nel primo passaggio.
È possibile utilizzare questa parola per parola, ma probabilmente vuole prendere le dichiarazioni di registro oppure passare a livello di debug, una volta che sei convinto
<!-- 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>
Mark la propria risposta come corretta, come funziona perfettamente. –