Integrando Sonar en Eclipse

Sonar es una herramienta fantástica para medir y asegurar la calidad en proyectos Java, habitualmente utilizamos Sonar dentro del ciclo de integración continua con Jenkins y revisamos los resultados y análisis de código a través de la web del servidor Sonar.

Mediante el plugin Sonar para eclipse, podemos integrar mucho mas Sonar con el desarrollo. Y consultar desde dentro de eclipse las metricas, violaciones de reglas, etc.

Intalación
El plugin de Sonar para eclipse esta disponible desde el marketplace, por lo tanto la instalanción es tan secilla como abrir el marketplace (Help > Eclipse Marketplace), buscar ‘sonar plugin’, e instalar.

sonar_eclipse_01
Una vez instalada abrimos las diferentes vistas del nuevo plugin, por ejemplo la vista Violations, desde (Windows -> Show View -> Other -> Sonar).

Configurar servidor Sonar
Desde (Windows -> Preferences -> Sonar) podemos configurar los servidores de Sonar que queramos utilizar. Por defecto viene configurada una ruta a un servidor sonar local en el puerto 9000. Aquí añadiriamos la ruta al servidor Sonar de nuestro equipo.
sonar_eclipse_02

Configurar proyecto
Por último tenemos que asociar cada uno de los proyectos del workspace para los que queramos utilizar el plugin Sonar.
Para ello con el boton derecho sobre el proyecto accedemos a (Sonar -> Associate with Sonar). Tenemos que indicar de forma manual el GroupId y ArtifactId de nuestro proyecto.
sonar_eclipse_03

Como ejemplo de las posibilidades del plugin, podemos ver como desde la vista ‘Violations’ tenemos un listado con todas las violaciones de reglas sonar. Tenemos la posibilidad de visualizarlas para todo el proyecto o únicamente para la clase actual.
sonar_eclipse_04

Desde la vista ‘Web’ de Sonar se visualiza la web de Sonar para la clase actual, estoy es muy util por ejemplo para comprobar la cobertura de una clase.
sonar_eclipse_05

Las vistas de ‘Hotspots’ y ‘Measures’, también pueden sernos de utilidad
sonar_eclipse_06

Documentación:
– Sonar Code Quality Testing Essential, Packtpub.
http://docs.codehaus.org/display/SONAR/Using+Sonar+in+Eclipse

Importar librerias JS como web resources Spring.

Spring MVC permite mapear las peticiones a una determinada ruta URL, hacia contenidos estáticos (JS, CSS, imagenes, …) que se encuentren en otra localización como el classpath, otro servidor, etc. Esto se consigue mediante la anotación del fichero webmvc-config.xml.

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources -->
<mvc:resources location="/, classpath:/META-INF/web-resources/" mapping="/resources/**"/>

Conociendo lo anterior podemos poner en juego una buena práctica, que consiste en empaquetar en un .jar las librerias JS que utilize nuestra aplicación, por ejemplo el framework JS Dojo. Y publicarlas como recurso web con Spring. De esta forma no tenemos que incluir en el código fuente de nuestra aplicación dichas librerias (con miles de ficheros .js). Lo que a la vez supone tener que versionar esos ficheros en nuestro SVN, dificulta el cambio de version de la libreria en cuestión, etc.

Como ejemplo creamos la libreria dojo-js-resources-1.7.1.jar con la estructura:
/META-INF/web-resources/
/dijit/
/dojo/
/dojox/

y la publico en mi repositorio maven. Podemos añadirla a cualquier proyecto con esta dependencia maven:

<dependency>
  <groupId>com.mylibs.dojo</groupId>
  <artifactId>dojo-js-resources</artifactId>
  <version>1.7.1</version>
</dependency>

lo que hará que este disponible en nuestro classpath, y que spring la publique en resources. Una URL de ejemplo sería: http://localhost:8080/myapp/resources/dojo/dojo.js

Log4j en JBoss AS 7

Para utilizar una configuración de logj4 personalizada desde la propia aplicación, necesitaremos incluir el fichero log4j.xml.

/WEB-INF/classes/log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="R" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${jboss.server.log.dir}/myapp.log" />
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1MB" />
    <param name="MaxBackupIndex" value="5" />
    <layout class="org.apache.log4j.PatternLayout">
     <param name="ConversionPattern" value="%d{dd/MM/yyyy hh:mm:ss} %-5p [%c] %m%n"/>
   </layout>
  </appender>
  <!-- The "category" represents the package names of your Application APIs which we want to log -->
  <category name="com.myapp">
   <priority value="INFO" />
   <appender-ref ref="R" />
  </category>
  <root>
   <priority value="INFO" />
   <appender-ref ref="R"/>
  </root>
 </log4j:configuration>

Además es necesario que nuestro .war contenga la libreria WEB-INF/lib/log4j-1.2.16.jar

pom.xml

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.16</version>
</dependency>

Así como indicar explicitamente a JBoss, que no utilize su propia libreria y configuración mediante este fichero:
/META-INF/jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <deployment>
    <exclusions>
        <module name="org.apache.log4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

Documentación
* http://middlewaremagic.com/jboss/?p=1458