Objetivo: modelar el ciclo de vida de un módulo de OpenCMS con Maven2
Si realizamos una búsqueda rápida en google vemos que las palabras OpenCMS y Maven no aparecen juntas facilmente. La única referencia interesante es el plugin desarrollado por Comundus, pero está orientado a la gestión del proyecto OpenCMS completo, no al desarrollo de módulos de forma aislada. En este post veremos cómo gestionar dependencias, compilar y empaquetar un módulo de OpenCMS con Maven2.
En el proceso de modelado hay una restricción: el código fuente debe ser compatible con el uso del plugin opencmsmoddev para Eclipse. Esto nos obliga a no seguir la estructura típica de un proyecto Maven sino la que requiere dicho plugin. La estructura requerida es la siguiente:
--+ src
--+ system
|--+ workplace
|--+ resources
--+ lib
--+ schemas
--+ templates
--+ manifest.xml
--+ pom.xml
Dada esta premisa, necesitamos configurar el P.O.M de una forma un poco especial. En primer lugar debemos indicar donde estan nuestros fuentes y donde poner los compilados:
<sourceDirectory>src</sourceDirectory>
<outputDirectory>classes</outputDirectory>
Además el resultado de realizar un mvn package debe ser un zip desplegable en una instancia de OpenCMS. Para ello utilizaremos el plugin maven-antrun-plugin con la siguiente configuración:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>zip-module</id>
<goals>
<goal>run</goal>
</goals>
<phase>package</phase>
<inherited>false</inherited>
<configuration>
<tasks>
<echo>Packaging OpenCMS Module...</echo>
<mkdir dir="target/dist/system/modules/${project.groupId}.${project.artifactId}" />
<copy todir="target/dist/system/modules/${project.groupId}.${project.artifactId}/src">
<fileset dir="src" />
</copy>
<copy todir="target/dist/system/modules/${project.groupId}.${project.artifactId}/classes">
<fileset dir="classes" />
</copy>
<copy todir="target/dist/system/modules/${project.groupId}.${project.artifactId}/schemas">
<fileset dir="schemas" />
</copy>
<copy todir="target/dist/system/modules/${project.groupId}.${project.artifactId}/templates">
<fileset dir="templates" />
</copy>
<copy todir="target/dist/system/workplace">
<fileset dir="system/workplace" />
</copy>
<copy file="manifest.xml" todir="target/dist" />
<zip destfile="target/${project.groupId}.${project.artifactId}.zip" basedir="target/dist" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
Esta tarea genera el zip requerido por OpenCMS a partir de lo que anteriormente hemos puesto en target/dist.
Aprovecharemos la gestión de dependencias que nos ofrece Maven, en principio la única dependencia que necesitamos es la del propio núcleo de OpenCMS. He usado como base OpenCMS 7.0.5, no he encontrado esta dependencia en ningún repositorio de Maven (conocido). Para solventar esto debemos instalarla en nuestro repositorio local e incluir la dependencia correspondiente en el P.O.M:
<dependency>
<groupId>org.opencms</groupId>
<artifactId>opencms</artifactId>
<version>7.0.5</version>
<scope>provided</scope>
</dependency>
La marcamos como provided ya que en tiempo de ejecución será OpenCMS el que la incluya en el classpath.
OpenCMS requiere que ciertos recursos se coloquen en el directorio src junto a los fuentes, para poder usar filtrado usaremos:
<resources>
<resource>
<directory>src</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
Al empaquetar el módulo necesitamos incluir todas sus dependencias (excepto la marcadas con scope provided), para ello usaremos maven-dependency-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>process-resources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeScope>provided</excludeScope>
<outputDirectory>target/dist/system/modules/${project.groupId}.${project.artifactId}/lib</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
Este es el fichero pom.xml completo.