9
votes

Utilisation de la fourmi pour fusionner deux fichiers de propriétés différentes

J'ai un fichier de propriétés par défaut et certains fichiers de propriétés spécifiques de déploiement qui remplacent certains paramètres de la valeur par défaut, en fonction de l'environnement de déploiement. J'aimerais que mon script de construction de fourmis fusionne les deux fichiers de propriétés (écrivant les valeurs par défaut avec des valeurs spécifiques de déploiement), puis émis les propriétés résultantes à un nouveau fichier.

J'ai essayé de le faire comme ça, mais j'étais infructueux: xxx


0 commentaires

5 Réponses :


3
votes

Peut-être que vous devriez peut-être regarder le Concat tâche de la fourmi pour cela. < / p>


0 commentaires

2
votes

Je pensais celui-ci. Il doit exister un fichier de propriétés supplémentaire créé, avec chaque clé / valeur du format suivant: mail.server.host = @ mail.server.host @ etc ...

Spécifiez ce fichier "modèle" à l'attribut "Fichier" de la tâche. Également dans le fichier filtre, spécifiez plusieurs avec le moins important énuméré en premier.

Donc, cela ressemblerait à ceci:

xxx


0 commentaires

0
votes

J'utilise personnellement ceci: xxx


0 commentaires

7
votes

Je l'ai fait comme ceci:

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

semble la meilleure réponse à moi puisqu'il devrait fonctionner avec des fichiers de propriétés réguliers plutôt que de nécessiter des jetons @ @


Cependant, cela semble ajouter des jetons d'évasion pour les valeurs de diverses propriétés. Par exemple: j'avais AA = D: \ ABCD. Cela a été converti en AA = D \: \\ ABCD. y-a-t-il un moyen d'éviter ça? Trouvé la tâche des ant Concat fonctionne mieux.



0
votes

Les autres réponses vont bien, mais j'en avais besoin sans ces limitations:

  • Le besoin de toutes les propriétés est spécifié en tant que modèles avec @ jetons @ (première réponse) li>
  • Expansion de la propriété - par exemple J'ai des propriétés définies comme prop2 = $ {prop1} qui seront étendues par une solution que les propriétés chargées et Echos li>
  • EchoProperties (@ user2500146) échappe à des caractères tels que des deux points qui sont gênants pour les propriétés d'URL (faute de la fourmi, les propriétés Java standard, qui permettent: à la place de =) li>
  • Propriétés répétées des solutions basées sur CONCAT (ces travaux, car la 2e définition est ignorée, mais je ne voulais pas répéter li> ul>

    À la fin, j'ai dû recourir à JavaScript dans un filtre, mais ma solution apporte des propriétés par défaut si et uniquement s'ils ne sont pas définis dans le fichier de propriétés principales. Il fonctionne en chargement des propriétés principales avec un préfixe obscuce, puis la copie sur la destination, puis concatez les propriétés par défaut pendant les filtrant em> toutes les propriétés par défaut chargées dans la première étape. P >

    Vous pouvez utiliser ce verbatim mais voudra probablement sortir les relevés de journal ou les modifier au niveau du débogage, une fois que vous êtes convaincu P>

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


1 commentaires

Pour être plus correct, je pouvais lire la propriété pour préfixer pour vous assurer que c'est la même chose, mais cela ne vaut pas le coût supplémentaire