2010-11-17 13 views
30

Tengo un archivo de hormigas que hace lo siguiente:¿Cómo puedo permitir que un archivo de propiedades Ant invalide el valor establecido en otro?

<property file="project.properties" description="Project configuration properties"/> 
<property file="build-defaults.properties" description="default build configuration."/> 
<property file="build.properties" description="local build configuration overrides"/> 

quiero tener opciones predeterminadas de build-defaults.properties (que se registró en SMC), pero permitirá a los desarrolladores anulan los valores en una acumulación local. propiedades para que puedan trabajar con rutas locales.

El problema es que no parece funcionar; Lo configuré, creé una anulación en build.properties, pero el valor de mi ruta sigue siendo el establecido en build-defaults.properties. ¿Cómo logro esto?

Respuesta

46

El problema inicial con su configuración es que tiene build.properties y build-defaults.properties invertidos.

Ant Properties se establecen una vez y luego nunca se pueden anular. Es por eso que establecer cualquier propiedad en la línea de comando a través de -Dproperty=value siempre anulará todo lo que haya establecido en el archivo; la propiedad está configurada y luego nada puede anularla.

Así que la forma en que desea esta configuración es:

<property file="build.properties" description="local build configuration overrides"/> 
<property file="project.properties" description="Project configuration properties"/> 
<property file="build-defaults.properties" description="default build configuration."/> 

esta manera:

  1. Cualquier cosa fijado en la línea de comandos tiene prioridad sobre build.properties
  2. Cualquier cosa encuentra en construcción. las propiedades anulan otros valores
  3. etc. en la línea.
17

En realidad ant propiedades pueden ser anuladas. Consulte la documentación de la property task:

valores de propiedad que normalmente no se pueden cambiar, una vez a la propiedad se establece, mayoría de las tareas no permitirán que su valor se va a modificar.

Una de las tareas que pueden anular el valor de propiedad es script. También cualquier tarea personalizada puede usar esta puerta trasera. Otras propuestas están en cuestión Ant loadfile override property. Esto va en contra del espíritu de la hormiga y generalmente es innecesario. Pero es bueno saber eso, porque acabo de tener un problema opuesto: por qué el valor de la propiedad cambió aunque es inmutable.

Aquí hay un objetivo de muestra que utiliza la tarea de secuencia de comandos para cambiar el valor de una propiedad. Muestra los métodos básicos para trabajar con propiedades. Todos los métodos se describen en Ant Api, que no está disponible en línea. Debe descargar el Ant Manual. En su directorio api está la documentación api.

<target name="t1"> 
    <property name="a" value="one" /> 
    <script language="javascript"> 
     sProp = project.getProperty("a"); 
     sProp = sProp.replace("e", "ly"); 
     project.setProperty("a", sProp); 
     project.setNewProperty("a", "new value"); 
    </script> 
    <property name="a" value="two" /> 
    <echo>a=${a}</echo> 
    </target> 

¿Cómo configurar fácilmente la tarea script? Hacer que la secuencia de comandos se ejecute con el lenguaje beanshell es un poco complicado y no es trivial, pero se explica en this answer. Sin embargo, como se indica en Rebse, el uso del lenguaje javascript se admite de fábrica en jdk 6.

+2

Configuración de la tarea de la escritura no es difícil cuando se utiliza JDK> = 1,6, significa que no hay frascos adicionales necesarios (Bean Scripting Framework y esas cosas ..) ya que los barcos de JDK con un motor de javascript ya (basado en Rhino 1.6R2). Solo use la tarea de script con javascript. Como alternativa, use Groovy, que solo necesita un contenedor – Rebse

+1

@Rebse, ha hecho mi día con la sugerencia 'javascript'. ¡Funciona a las mil maravillas! Edité mi respuesta para incluirla. Para otros idiomas, incluso si necesitan solo un contenedor, el enlace sigue siendo útil. – Jarekczek

+0

alerta desvergonzada de promoción ;-) Ant complemento Flaka (http://code.google.com/p/flaka/) hace que muchas partes de scripting obsolet (sobrescritura de propiedad, bucles ...), también solo necesita un jar. Además de Flaka, uso Groovy muchísimo, no solo para las secuencias de comandos de hormiga. – Rebse

3

propiedad Ant no se puede sobrescribir menos que use macro y JavaScript plug-in para hacer:

Paso 1: definir una función macro para sobrescribir propiedad

<!--overwrite property's value--> 
    <macrodef name="set" > 
     <attribute name="name"/> 
     <attribute name="value"/> 
     <sequential> 
      <script language="javascript"> 
       <![CDATA[ 
       project.setProperty("@{name}", "@{value}"); 
       ]]> 
      </script> 
     </sequential> 
    </macrodef> 

Paso 2: utilizar la macro en el xml hormiga

<set 
    name="your_target_property" 
    value="your_value" or "${another_property}"  
</set> 
Cuestiones relacionadas