22 mayo 2016

Maven: renombrar masivamente properties de versiones de dependencias en POM

Supongamos que tenemos un pom.xml de Maven en donde usamos properties para definir las versiones de nuestras dependencias y luego las referenciamos con placeholders ${}:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <modelVersion>4.0.0</modelVersion>

 <groupId>ar.com.kamikazesoftware</groupId>
 <artifactId>test</artifactId>
 <version>1.0-SNAPSHOT</version>

 <properties>
  <version.commons-lang3>3.4</version.commons-lang3>
  <version.commons-io>2.4</version.commons-io>
  <!-- más definiciones similares (version.x) -->
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>${version.commons-lang3}</version>
  </dependency>
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>${version.commons-io}</version>
  </dependency>

  <!-- más definiciones de dependencias similares, usando <version>${version.x}</version> -->
y queremos invertir el orden del prefijo version y el nombre de la dependencia, queremos obtener:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <modelVersion>4.0.0</modelVersion>

 <groupId>ar.com.kamikazesoftware</groupId>
 <artifactId>test</artifactId>
 <version>1.0-SNAPSHOT</version>

 <properties>
  <commons-lang3.version>3.4</commons-lang3.version>
  <commons-io.version>2.4</commons-io.version>
  <!-- más definiciones similares (version.x) -->
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>${commons-lang3.version}</version>
  </dependency>
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>${commons-io.version}</version>
  </dependency>

  <!-- más definiciones de dependencias similares, usando <version>${version.x}</version> -->
Si sólo tenemos unas pocas definiciones podemos buscar y reemplazar individualmente los nombres con un editor de texto, pero esto se vuelve poco práctico si tenemos decenas de definiciones. Podemos entonces usar sed para reemplazar todas las apariciones del patrón version.x por x.version.
# reemplazar  con 
sed -e 's/\(]*\)>\)/<\2.version>/' -i pom.xml

# reemplazar  con 
sed -e 's/\(<\/version\.\([^>]*\)>\)/<\/\2.version>/' -i pom.xml

# reemplazar ${version.algo} con ${algo.version}
sed -e 's/\${version\.\([^}]*\)}/\${\1.version}/' -i pom.xml