tattletale_logo_600px
¿Alguna vez te has encontrado un problema al ejecutar tu aplicación web porque varios de los ficheros jar incluidos tienen las mismas clases en diferentes versiones y la que coge el servidor de aplicaciones es la incorrecta?

Utilizando la herramienta Tattletale de JBoss y su plugin Maven, puedes encontrar fácilmente si tienes clases duplicadas en la carpeta WEB-INF/lib de tu WAR y más importante, hacer que falle la construcción automáticamente si eso ocurre, de modo que no sea demasiado tarde y te ocurra en producción.

Simplemente añade la siguiente configuración del plugin en el pom de tu WAR, en la sección build/plugins. También se puede utilizar en EAR, assemblies y otros tipos de proyectos.

	
<plugin>
  <groupId>org.jboss.tattletale</groupId>
  <artifactId>tattletale-maven</artifactId>
  <version>1.1.2.Final</version>
  <executions>
    <execution>
      <phase>verify</phase> <!-- needs to run after WAR package has been built -->
      <goals>
        <goal>report</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <source>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</source>
    <destination>${project.reporting.outputDirectory}/tattletale</destination>
    <reports>
      <report>jar</report>
      <report>multiplejars</report>
    </reports>
    <profiles>
      <profile>java6</profile>
    </profiles>
    <failOnWarn>true</failOnWarn>
    <!-- excluding some jars, if jar name contains any of these strings it won't be analyzed -->
    <excludes>
      <exclude>persistence-api-</exclude>
      <exclude>xmldsig-</exclude>
    </excludes>
  </configuration>
</plugin>

Tendrás que añadir el repositorio Maven de JBoss a la sección repositories de tu POM, o a tu gestor de repositorios. Asegúrate de utilizar el repositorio que solamente contiene artefactos JBoss o podrías experimentar conflictos entre artefactos en ese repositorio y el repositorio Central de Maven.

<repository>
  <id>jboss</id>
  <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
  <releases>
    <enabled>true</enabled>
  </releases>
  <snapshots>
    <enabled>false</enabled>
  </snapshots>
</repository>

Nota: Añadir repositorios extra es una fuente común de problemas que provoca construcciones más lentas (se consulta todos los repositorios en busca de artefactos).

vía

Maven
HAZ LA CONSTRUCCIÓN REPRODUCIBLE

* Especifica siempre una versión de los plugins Maven2
Modo incorrecto

<plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-surefire-plugin</artifactid>
</plugin>

Modo correcto

<plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-surefire-plugin</artifactid>
 <version>2.3</version>
 </plugin>

Esto importa porque si no pones la versión, maven2 utiliza por defecto la ULTIMA disponible.

Esto quiere decir que

  • el resultado del plugin puede ser impredecible si la implementación ha cambiado (características nuevas/eliminadas, …)
  • tu proyecto, sin saberlo, se convierte automáticamente en un beta-tester para plugins de terceros si la última versión es una SNAPSHOT

Las nuevas versiones de m2eclipse mostrarán una advertencia en la consola. Puede revisar también el plugin enforcer de maven.

Leer el resto de esta entrada »

m2eclipse
Esta posibilidad está disponible bajo el menú Import.

Por ejemplo, pulsa el botón derecho en una fichero jar de tu workspace, selecciona Import –> Maven –> Install or deploy an artifact to a Maven repository.

vía

Maven
Ultimamente estaba teniendo problemas al arrancar mi Eclipse (versión 3.5.0) ya que el plugin m2eclipse (versión 0.9.9 – 20090820) intentaba actualizar los índices de los repositorios de Maven y fallaba en el intento dando siempre un NullPointerException.

Una posible solución, aunque tal vez no sea la mejor, consiste en limpiar la caché de nexus que utiliza el plugin, de tal modo que vuelva a generar todos los índices. Para ello nada mas facil que eliminar la carptea:

  • <workspace>\.metadata\.plugins\org.maven.ide.eclipse\nexus

estando Eclipse cerrado.

Tras esto, deberías poder actualizar los índices sin problema.

vía

Maven
Para poder conpilar con el SDK de Flex usando Maven, existen varios plugins. Entre ellos:

Pero antes de poder utilizar ningudo de ellos, lo primero es tener disponible en nuestro repositorio de Maven una copia del SDK de Flex (copia no disponible en los repositorios públicos por no ser de libre distribución).

Para consiguir instalar el SDK de Flex de forma sencilla en nuestro repositorio, dentro de flex-mojos, existe el mojo install-mojo que mediante el siguiente comando nos permite realizar la instalación en nuestro repositorio local:

mvn info.flex-mojos:install-mojo:2.0M6:install-sdk -Dflex.sdk.folder="C:\software\flex_sdk_3" -Dversion=3.1.0.2710

El anterior comando nos instalará el SDK situado en “C:\software\flex_sdk_3” en el repositorio y nos dejará disponibles a partir de ese momento varios artefactos, siendo los dos más importantes:

<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>playerglobal</artifactId>
<version>3.1.0.2710</version>
<type>swc</type>
<scope>external</scope>
</dependency>

y

<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>flex-framework</artifactId>
<version>3.1.0.2710</version>
<type>pom</type>
</dependency>

El primero es el compilador. Cosas de Java. JARs.
El segundo es el framework flex. Cosa de Flex. SWCs.

NOTA: La dependencia flex-framework es la que se debería utilizar como dependencia de tu proyecto. Ambas dependencias no se deberían utilizar juntas y por tanto, si aparecen ambas en el el mismo bloque de dependencias de tu proyecto es muy probable que algo vaya mal.

Ahora bien, existe un problema y es que cuando intentamos compilar la aplicación obtenemos un error de Maven indicando que no puede resolver una dependencia a playerglobal. Esto es devido a que la instalación que acabamos de realizar crea en el repositorio de maven (.m2\repository\com\adobe\flex\framework\playerglobal) un directorio con el nombre “9-3.1.0.2710” en vez del esperado “3.1.0.2710“. La solución pasa por renombrar el directorio (esto es, eliminar el “9-“) y renombrar el .pom y el .swc contenidos en dicho directorio (para que su versión no contenga el “9-“), y editar el archivo playerglobal-3.1.0.2710.pom corrigiendo la <version>.

Algunos enlaces de interés

Install-mojo
install mojo – makes playerglobal version have “9-” in front of it?
Maven and Flex Builder tutorial

Maven
Tenía un proyecto construido con maven en el que mostraba en la cabecera el número de versión pero necesitaba además mostrar la fecha y hora en la que se construyó dicha versión (y así poder tener un seguimiento más preciso de incidencias asociadas a una versión y fecha dadas).

La versión y fecha de la misma, se muestran en una jsp, recuperando el valor a mostrar de un archivo .properties donde defino la propiedad del siguiente modo:

label.version = Ver. ${project.version} (${build.time})

Este fichero se encuentra alojado en src/main/resources y será procesado por Maven, realizando la sustitución, al realizar un process-resources.

El valor de “project.version” ya está definido en el propio pom.

Para conseguir el valor de build.time definiremos una tarea ANT usando el plugin de maven correspondiente, del siguiente modo:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<mkdir dir=”${project.build.directory}”/>
<tstamp>
<format property=”last.updated” pattern=”dd/MM/yyyy”/>
</tstamp>
<echo file=”${basedir}/target/filter.properties” message=”build.time=${last.updated}”/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>

Ahora solamente nos falta especificar que los recursos sean filtrados y la ubicación del fichero utilizado para realizar el mismo:

<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>

<filters>
<filter>${basedir}/target/filter.properties</filter>
</filters>

Algunos enlaces de interés

Cookbook: How To Add Build Time To A JAR Manifest?
Maven: Adding Custom Attributes and Build Timestamp to Manifest

Maven
En el archivo settings.xml (bien en el del usuario o en el global de maven) crearemos un perfil que defina unas variables de entorno con el path de los diferentes compiladores que utilizamos:

<profiles>
<profile>
<id>dev</id>
<properties>
<JAVA_1_6_HOME>C:\software\jdk1.6</JAVA_1_6_HOME>
<JAVA_1_5_HOME>C:\software\jdk1.5</JAVA_1_5_HOME>
<JAVA_1_4_HOME>C:\software\jdk1.4</JAVA_1_4_HOME>
<JAVA_1_3_HOME>C:\software\jdk1.3</JAVA_1_3_HOME>
<JAVA_1_2_HOME>C:\software\jdk1.2</JAVA_1_2_HOME>
</properties>
</profile>
</profiles>

<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>

Ahora, en el pom.xml del proyecto, configuraremos el plugin de compilación para que utilice un compilador específico:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.4</source>
<target>1.4</target>
<fork>true</fork>
<executable>${JAVA_1_4_HOME}/bin/javac</executable>
</configuration>
</plugin>

Nota: La propiedad fork es necesaria porque en caso contrario maven utiliza el mismo proceso con el que se arranca el propio plugin y por tanto la misma JDK, independientemente de la que hayamos indicado en la configuración.

Algunos enlaces de interés

Compiling Sources Using A Different JDK

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: