Me estoy pegando desde ayer para integrar nuestro actual proyecto con Sonar, para poder realizar pruebas de cobertura y mostrar estadísticas de infracciones de código, y tras la instalación de Sonar en local me he encontrado un problema al ejecutarlo las primeras veces.
Tras la instalación, al lanzar por primera vez Sonar con:
1 | mvn sonar:sonar |
obtenía errores al faltarme librerías, que no estaban en nuestro repositorio y he tenido que ir bajándome de MVNRepository, para luego instalarlas en nuestro Artifactory.
Tras incluir todas las librerías necesarias, al lanzar el comando me he encontrado con el siguiente error:
1 2 3 4 5 6 | [ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.0:sonar ( default -cli) on project tbs: Execution default -cli of goal org.codehaus.mojo:sonar-maven-plugin:2.0:sonar failed: A required class was missing while executing org.codehaus.mojo:sonar-maven-plugin:2.0:sonar: Ljavax/persistence/EntityManagerFactory; |
En principio no debería de producirse, ya que se supone que al descargar los JARs y subirlos, estos incluyen el pom con las dependencias sobre otras librerías.
Pero ha dado la casualidad de que para la librería plexus-classworlds-2.2.3 su pom está mal y necesita que incluyamos dos dependencias más: persistence-api-1.0 y javassist (yo he incluido la última versión: 3.12.1.GA).
De esta forma, el pom queda así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | < dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >3.8.2</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >javax.persistence</ groupId > < artifactId >persistence-api</ artifactId > < version >1.0</ version > < scope >compile</ scope > </ dependency > < dependency > < groupId >javassist</ groupId > < artifactId >javassist</ artifactId > < version >3.12.1.GA</ version > < scope >compile</ scope > </ dependency > </ dependencies > |
Tenerlo en cuenta por si os encontráis con el mismo problema.
En caso de que la clase que os falte sea otra y no sepáis desde dónde se hace referencia, lanzar el comando en modo debug:
mvn sonar:sonar -X
Revisar las trazas y además del nombre de la clase que necesitáis, tomar nota de la clase donde se está invocando a la misma, como en este ejemplo:
A partir de aquí, primero tendréis que averiguar, tirando de Google, a qué librería pertenece la clase que os falta, y después en cuál de las que habéis incluido se encuentra la clase que la usa.
En mi caso la clase javax.persistence.EntityManagerFactory se encuentra en persistence-api-1.0.jar, así que lo busco en algún repositorio de Maven y lo subo a mi artifactory.
Y la clase que la requiere se encuentra en plexus-classworlds-2.2.3, así que me descargo el pom del Artifactory y lo modifico para incluir la dependencia que necesito, volviendo a subir el pom al Artifactory.
Una vez hecho, borro mi repositorio local, para forzar que se lo vuelva a descargar, y compruebo si necesito alguna dependencia más o ya funciona Sonar.