jacoco - moraleja - fabulas largas
JaCoCo No se pueden agregar clases diferentes con el mismo nombre: org/hamcrest/BaseDescription (3)
Hola, estoy golpeando la siguiente excepción al ejecutar una cobertura de JaCoCo:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.5.8.201207111220</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Error while creating report: Can''t add different class with same name: org/hamcrest/BaseDescription
java.lang.IllegalStateException: Can''t add different class with same name: org/hamcrest/BaseDescription
at org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.java:89)
at org.jacoco.core.analysis.Analyzer$1.visitEnd(Analyzer.java:79)
at org.objectweb.asm.ClassAdapter.visitEnd(Unknown Source)
at org.jacoco.core.internal.flow.ClassProbesAdapter.visitEnd(ClassProbesAdapter.java:128)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:94)
at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:115)
at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:155)
at org.jacoco.core.analysis.Analyzer.analyzeArchive(Analyzer.java:135)
at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:158)
at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:183)
at org.jacoco.maven.ReportMojo.createBundle(ReportMojo.java:280)
at org.jacoco.maven.ReportMojo.createReport(ReportMojo.java:256)
at org.jacoco.maven.ReportMojo.executeReport(ReportMojo.java:230)
at org.jacoco.maven.ReportMojo.execute(ReportMojo.java:208)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Estoy de acuerdo con rb512. Un caso / área más en el que puede aparecer este error es, durante el proceso de compilación, si estamos utilizando JIBX / WST, etc. u otros pasos / proceso similares que crean archivos de clase dinámicos (en tiempo de compilación), es decir, para los cuales no tenemos ningún correspondiente válido Archivo fuente (.java / .groovy, etc.) en el espacio de trabajo.
En ese caso, su área de trabajo tendrá archivos de clase adicionales y cuando jacoco intentará generar el informe, se producirá un error con el mismo error para una clase duplicada. Si encuentra este error debido a este caso, debe eliminar cualquier archivo de clase antes de ejecutar informes jacoco
Si está utilizando Gradle (para Maven, haga lo mismo en el archivo .xml de Maven pom), vea el bloque doFirst
debajo del cual está haciendo el truco.
jacocoTestReport {
//cleaning up the JiBx classes to jacoco will not cause problems for CareDiscovery
doFirst {
delete fileTree (dir: "${buildDir}/classes", include: "**/JiBX_*.class")
}
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
executionData = fileTree(dir: ''build/jacoco'', include: ''**/*.exec'')
reports {
xml{
enabled true
//Following value is a file
destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
}
csv.enabled false
html {
enabled true
//Following value is a folder
destination "${buildDir}/reports/jacoco/html"
}
}
sourceDirectories = files([''src/java'',''src/main/java'', ''src/main/groovy''])
classDirectories = files(''build/classes/main'')
}
Hay dos formas de evitar esto:
1) Cambie el nombre de uno de los duplicados : He visto este problema con bastante frecuencia cuando se trata de proyectos de expertos. Incluso si esas dos clases están en dos módulos diferentes, tener los mismos nombres para dos clases diferentes no es realmente una buena idea.
2) Excluya uno de ellos : consulte this subproceso SO para obtener más información.
Tengo el mismo problema que tú. Resulta que tenía dos tarros en la carpeta de mi proyecto que hicieron lo mismo, aunque solo uno de ellos estaba en la ruta de compilación. Compruebe si tiene más de un tarro de hamcrest en su código.