2012-08-17 16 views
13

En experta que es muy fácil de configurar las propiedades de un pom con la siguiente sintaxis:En Maven, ¿cómo puedo construir dinámicamente un valor de propiedad en tiempo de ejecución?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

Ahora necesito para construir una propiedad que depende de la versión de mi pom. Para la creación de la propiedad que quiero hacer lo siguiente (pseudo código java):

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

Debe ser dinámico, ya que se utiliza como un nombre de etiqueta en nuestro repositorio y siempre debe estar sincronizado con la versión de la artefacto.

¿Alguna idea sobre cómo crear esas propiedades "dinámicas"?

Respuesta

25

de Mojo Build-ayudante Maven plugin puede ayudarle a cabo aquí.

Hay una serie de objetivos que se pueden utilizar para ayudar a transformar las propiedades.

Hay

Probablemente regex-property es el que usted desea, pero si su v Los números de ersión se ajustan a los "estándares", los otros dos podrían salvarte.

Para usar el objetivo regex-property que haría algo como

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Nota: mi expresión regular podría estar ligeramente desviado por lo que debe probar lo anterior.

Nota: El valor de la propiedad solo estará disponible para ejecuciones después de la fase a la que está vinculada esta ejecución. La fase predeterminada a la que está vinculado es validate, pero si se encuentra en un ciclo de vida diferente (por ejemplo, el ciclo de vida del sitio), el valor no estará disponible.

+0

Y si no enlace el complemento a una fase. Estoy usando el complemento de lanzamiento maven y llamo al lanzamiento del objetivo: preparar. ¿Cómo lo hago disponible aquí? – EhmKah

+0

si no especifica una fase, de forma predeterminada está vinculada a la fase 'validate', por lo que el fragmento de código anterior ejecutará el objetivo cuando la fase de validación esté activa. cuando invocas un objetivo directamente, p. 'release: prepare', lo que sucede es que maven ejecuta el objetivo salteando directamente las fases del ciclo de vida, por lo que el objetivo' release: prepare' no verá la propiedad * pero * el ciclo de vida * bifurcado * por 'release: prepare' se verá eso. Por lo tanto, 'release: prepare' no podrá usar la propiedad para etiquetar SCM, pero la propiedad estará presente en la versión bifurcada ejecutada en el complemento de publicación –

+1

Si desea tener la etiqueta SCM basada en la propiedad (debe actualizar su pregunta para reflejar que este es su objetivo, o comenzar una segunda pregunta) entonces es posible que necesite usar algo como http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormat though eso no te dará la sustitución '_' que deseas ni la inyección' _P'. Recomiendo cambiar los requisitos del nombre de la etiqueta en lugar de intentar doblegar Maven ;-) –

2

Puede usar el complemento maven build-helper, en particular su regex-property mojo. Eche un vistazo a usage examples (desplácese a Establezca una propiedad al aplicar un reemplazo de expresiones regulares a una sección de valor).

Básicamente quieres algo así en tu pom para obtener myVersionTag propiedad deducida de myValue:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

Hubiera marcado esta respuesta como aceptada también porque es la misma que la anterior. Gracias. – EhmKah

+1

No del todo. El ejemplo de Ihor coloca una '\' entre '$' y '{' en el elemento . Así es como el documento de Codehaus dice que lo haga, pero está mal. El objetivo de propiedad de expresiones regulares no funcionará con la barra diagonal inversa y funciona sin ella. Y Codehaus está fuera del negocio. –

+0

@SteveCohen Si los documentos son incorrectos, abra un problema https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise

2

La respuesta de Ihor Kaharlichenko es básicamente correcta, salvo que copia un error del Codehaus documentation. No debe haber '\' entre '$' y '{'. El mojo funciona sin él y no funciona con él. Verdaderamente, con una comprensión básica de Regex y Maven, no pude ver qué se suponía que debía hacer la barra invertida y, de hecho, está mal.

La respuesta de Stephen Connolly omite correctamente la barra diagonal inversa. Ten cuidado.
Este error ha proliferado a lo largo de SO y con Codehaus que no está operativo probablemente nunca será reparado.

Cuestiones relacionadas