“Unmappable character for encoding UTF-8″ al compilar proyectos Java con Maven

Si al compilar un proyecto no da errores del tipo: /ruta/al/proyecto/src/main/java/paquete/Clase.java:[48,30] unmappable character for encoding UTF8 y en esa línea tenemos caracteres con tilde, ñ u otros caracteres “problemáticos”, es muy posible que sea necesario cambiar la configuración del encoding a ISO-8859-1 en la sección de maven-compiler-plugin del archivo pom.xml de nuestro proyecto:

<project>
	...
	<build>
		<plugins>
			...
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					...
					<encoding>ISO-8859-1</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
	...
</project>

Otra opción es sacar esos caracteres del código fuente, totalmente viable si estamos hablando de comentarios, o utilizar
secuencias de escape para representar los caracteres que necesitamos (por ejemplo, ‘u00F6′ en lugar de ‘ö’)

Espero que a alguien más le sea útil este tip.

Configurar log4j desde beans de Spring Framework

Si queremos inicializar log4j al inicializar un contexto de Spring, el framework nos provee la clase org.springframework.util.Log4jConfigurer. Para configurar un bean utilizamos la clase org.springframework.beans.factory.config.MethodInvokingFactoryBean para invocar el método estático initLogging.

Este método recibe como parámetro un String que contiene la localización del archivo de configuración de log4j. Tiene otra sobrecarga que recibe además un long que representa el período en milisegundos en la que un thread verificará si el archivo tuvo cambios, y en caso
afirmativo, recargará la configuración de log4j.

El bean de Spring framework se define de la siguiente forma:

<bean id='log4jInitializer' class='org.springframework.beans.factory.config.MethodInvokingFactoryBean'>
   <property name='staticMethod' value='org.springframework.util.Log4jConfigurer.initLogging' />
   <property name='arguments'>
      <list>
         <value>configuracion_log4j</value>
      </list>
   </property>
</bean>

El parámetro configuracion_log4j apunta a un recurso que puede estar dentro del classpath (por ejemplo, “classpath:log4j.properties“) o ser un archivo del sistema (por ejemplo “file:/home/user/sample/log4j.properties“).

Además, el archivo puede ser la configuración en forma de archivo properties o de archivo XML. Dependiendo de la extensión del archivo, el método initLogging seleccionará la
forma de inicializar la configuración (utilizando DOMConfigurator o PropertyConfigurator).

Evitar la ejecución de tests o ignorar resultados al utilizar Maven

Si por alguna razón queremos evitar que Maven ejecute los tests unitarios al invocarlo, podemos agregar el parámetro -Dmaven.test.skip=true o -DskipTests=true al invocarlo, por ejemplo,

mvn jar -Dmaven.test.skip=true

Si queremos que ejecute los tests pero que ignore los resultados, es decir, que no cancele la ejecución si algún test falla, podemos agregar el parámetro “-Dmaven.test.failure.ignore=true” a la invocación a Maven.

Si tenemos tests unitarios implementados, obviamente no es lo ideal evitar su ejecución, o ignorar los fallos que tengan, pero de tanto en tanto puede ser útil.

Para los tests de integración, que por concepto quizá tengan que interactuar con otros sistemas, tenemos la opción de configurar la exclusión de ciertos archivos, y que los tests contenidos en ellos no se ejecuten automáticamente al correr los goals de test de Maven. Esto se configura en el POM del proyecto, al configurar
las opciones del plugin Surefire (ejecución de tests):

<build>
	<plugins>
		[...]
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-surefire-plugin</artifactId>
			<configuration>
				<includes>
					<include>**/*.java</include>
				</includes>
				<excludes>
					<exclude>integrationTests</exclude>
				</excludes>
				<forkMode>never</forkMode>
			</configuration>
		</plugin>
		[...]
	</plugins>
</build>

Para este ejempo planteado, ejecutará todos los tests del directorio correspondiente, excluyendo los que están dentro del directorio integrationTests y sus subdirectorios.

Referencias

http://maven.apache.org/general.html#skip-test
http://maven.apache.org/plugins/maven-surefire-plugin/examples/skipping-test.html
http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html