2011-01-05 23 views
7

Ho un file di proprietà predefinito e alcuni file di proprietà specifiche di distribuzione che sovrascrivono determinate impostazioni dal predefinito, in base all'ambiente di distribuzione. Vorrei che il mio script Ant-build unisse i due file delle proprietà (sovrascrivendo i valori predefiniti con valori specifici di distribuzione) e quindi restituisse le proprietà risultanti in un nuovo file.Utilizzo di Ant per unire due file di proprietà differenti

ho provato a farlo in questo modo, ma non ci sono riuscito:

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

risposta

2

forse si dovrebbe guardare il compito concat di Ant per questo.

2

Ho immaginato questo fuori. Ci deve essere un proprietà aggiuntive file creato, con ogni chiave/valore nel seguente formato: mail.server.host = @ @ mail.server.host ecc ...

Poi specificare il file "modello" all'attributo "file" dell'attività. Inoltre, nel set di filtri, specificare più elementi con il meno importante elencato per primo.

Quindi sarebbe simile a questa:

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

+0

Mark la propria risposta come corretta, come funziona perfettamente. –

0

Io personalmente uso questo:

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

ho fatto in questo modo:

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

sembra la migliore risposta a me dal momento che dovrebbe funzionare con file di proprietà regolari anziché richiedere token @ – Rhubarb

+0

Tuttavia questo sembra aggiungere token di escape per i valori di varie proprietà. Ad esempio: ho avuto aa = D: \ abcd. Questo è stato convertito in aa = D \: \\ abcd. C'è un modo per evitarlo? Trovato il compito di ant concat funziona meglio. – vanval

0

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

Per essere più corretto, potrei leggere la proprietà di PREFIX per assicurarmi che sia la stessa, ma non vale il costo aggiuntivo – Rhubarb

Problemi correlati