2011-01-05 15 views
7

Tengo un archivo de propiedades predeterminado y algunos archivos de propiedades específicas de la implementación que anulan ciertas configuraciones de las predeterminadas, en función del entorno de despliegue. Me gustaría que mi script de compilación Ant incorpore los dos archivos de propiedades (sobrescribiendo los valores predeterminados con valores específicos de implementación) y luego las propiedades resultantes a un nuevo archivo.Usar Ant para unir dos archivos de propiedades diferentes

he intentado hacerlo como tal pero no tuvo éxito:

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

Respuesta

2

tal vez debería mirar el concat tarea de hormiga para esto.

2

Me figuré esto. Es necesario que haya un archivo creado propiedades adicionales, con cada clave/valor en el siguiente formato: mail.server.host = @ @ mail.server.host etc ...

a continuación, especifique el archivo "plantilla" al atributo "archivo" de la tarea. También en el conjunto de filtros, especifique el primero con el menos importante.

Por lo que se vería así:

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

+0

Marque su propia respuesta como correcta, ya que funciona perfectamente. –

0

Yo personalmente uso esto:

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

lo hice así:

<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

parece la mejor respuesta para mí, ya que debería funcionar con archivos de propiedades normales en lugar de requerir @ tokens @ – Rhubarb

+0

Sin embargo, esto parece agregar tokens de escape para los valores de varias propiedades. Ejemplo: tuve aa = D: \ abcd. Esto se convirtió a aa = D \: \\ abcd. Hay alguna manera de evitar esto? La tarea encontrada de hormigas concatres funciona mejor. – vanval

0

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

Para ser más correcto, pude leer la propiedad de PREFIX para asegurar que sea la misma, pero no vale la pena el costo adicional – Rhubarb

Cuestiones relacionadas