最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 。 对于Sonar数据库,我使用的是Postgres 9.4 。
声纳跑步者的日志文件给了我这个:
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
build 22-Jun-2015 07:44:30 INFO: EXECUTION FAILURE
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
build 22-Jun-2015 07:44:30 Total time: 9.153s
build 22-Jun-2015 07:44:30 Final Memory: 30M/1039M
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
error 22-Jun-2015 07:44:30 ERROR: Error during Sonar runner execution
error 22-Jun-2015 07:44:30 ERROR: Unable to execute Sonar
error 22-Jun-2015 07:44:30 ERROR: Caused by: Unable to save file sources
error 22-Jun-2015 07:44:30 ERROR: Caused by: -1
没什么用! 我认为存在一些权限问题,因为“无法保存文件源”通常意味着! 但是没有权限问题。 然后,我禁用了分析的Cobertura部分,一切正常,因此Cobertura部分出了问题。 然后,我:
- 启用详细日志记录— sonar.verbose = true
- 启用了完整堆栈跟踪日志记录—使用-e开关
- 使用-X开关启用了完整的调试日志记录
这提供了更多线索。
error 22-Jun-2015 11:09:06 ERROR: Error during Sonar runner execution
build 22-Jun-2015 11:09:06 INFO: ------------------------------------------------------------------------
error 22-Jun-2015 11:09:06 org.sonar.runner.impl.RunnerException: Unable to execute Sonar
error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
error 22-Jun-2015 11:09:06 at java.security.AccessController.doPrivileged(Native Method)
error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
error 22-Jun-2015 11:09:06 at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
error 22-Jun-2015 11:09:06 at org.sonar.runner.api.Runner.execute(Runner.java:100)
error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.executeTask(Main.java:70)
error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.execute(Main.java:59)
error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.main(Main.java:53)
error 22-Jun-2015 11:09:06 Caused by: java.lang.IllegalStateException: Unable to save file sources
error 22-Jun-2015 11:09:06 at org.sonar.batch.index.SourcePersister.persist(SourcePersister.java:84)
error 22-Jun-2015 11:09:06 at org.sonar.batch.phases.DatabaseModePhaseExecutor.executePersisters(DatabaseModePhaseExecutor.java:165)
error 22-Jun-2015 11:09:06 at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:133)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)
error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
error 22-Jun-2015 11:09:06 at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)
error 22-Jun-2015 11:09:06 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
error 22-Jun-2015 11:09:06 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
error 22-Jun-2015 11:09:06 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
error 22-Jun-2015 11:09:06 at java.lang.reflect.Method.invoke(Method.java:606)
error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
error 22-Jun-2015 11:09:06 ... 9 more
error 22-Jun-2015 11:09:06 Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
error 22-Jun-2015 11:09:06 at java.util.ArrayList.elementData(ArrayList.java:371)
error 22-Jun-2015 11:09:06 at java.util.ArrayList.get(ArrayList.java:384)
error 22-Jun-2015 11:09:06 at com.google.protobuf.RepeatedFieldBuilder.getBuilder(RepeatedFieldBuilder.java:245)
error 22-Jun-2015 11:09:06 at org.sonar.server.source.db.FileSourceDb$Data$Builder.getLinesBuilder(FileSourceDb.java:2911)
error 22-Jun-2015 11:09:06 at org.sonar.batch.index.SourceDataFactory.
现在,我可以在日志的前面看到Cobertura分析已经完成。 我还可以看到Cobertura coverage.xml生成正常(这是整理代码coverage信息的文件)。 创建coverage.xml文件之后,下一步是让声纳运行器解析该文件并将其发送给Postgres,在解析阶段必须出错,因为连接到Postgres绝对不是问题(记住Cobertura禁用后一切都很好) )。 我知道将请求发送到Postgres没问题,所以认为coverage.xml文件中一定有一些奇怪的地方,这意味着Sonar运行程序无法解析它。 如前所述,coverage.xml文件详细说明了每个类的行号已经被覆盖。 样品:
<class name="com.dublintech.me.ApiLogFilters" filename="com/dublintech/me/ApiLogFilters.groovy" line-rate="0.0" branch-rate="0.0" complexity="0.0">
<methods>
<method name="<clinit>" signature="()V" line-rate="0.0" branch-rate="1.0">
<lines>
<line number="25" hits="0" branch="false">
</line></lines>
</method>
...
</methods></class>
...
那么什么样的东西可以使解析桶呢? 如果coverage.xml文件中有一些奇数行怎么办? 嗯……要检查这一点,我运行了以下grep:
> grep "line number" coverage.xml
这给了太多。 负数行号怎么办?
>grep "line number=\"\-" coverage.xml
不,没有 好,回到异常,看这一行:
java.lang.ArrayIndexOutOfBoundsException: -1
hmmm ...如果行号为0,我想知道它是否可以在声纳运行器中进行一些数组解析,从而使索引超出范围?
>grep "line number=\"0" coverage.xml
击中! 是时候前后grep行,并获得有关此文件的更多信息。
>grep -C20 "line number=\"0" coverage.xml
这给了我罪魁祸首。 对于我来说,Cobertura为什么说行号0的点击率为0毫无意义。 仍然可以打开Cobertura html报告并查看分析。 声纳在解析时只是在f地。 因此,通过将以下内容添加到我的构建配置中,从Cobertura分析中删除了此文件。
coverage {
xml = true
exclusions = [
"**/com/dublintech/me/MyOddFile*"
]
}
然后,我重新运行,嘿嘿,一切正常。 该文件不在coverage.xml文件中。 这意味着Sonar跑步者可以解析文件,一切正常。
我喜欢声纳,喜欢稳定的构造,喜欢快速反馈,是的,当它再次工作时,我是一个快乐的人!
翻译自: https://www.javacodegeeks.com/2015/06/problems-with-cobertura-and-sonar-5-1.html