一次sonar project 扫描,sensorContext 分别会创建DefaultHighlighting(语言高亮标记设置)
和DefaultMeasure(统计测量属性),且只能设置一次。否则会报错:
Caused by: java.lang.UnsupportedOperationException: Can not add the same measure twice on src/main/resources/application-dev.properties: DefaultMeasure[component=src/main/resources/application-dev.properties,metric=Metric[id=<null>,key=ncloc,description=Non commenting lines of code,type=INT,direction=-1,domain=Size,name=Lines of Code,qualitative=false,userManaged=false,enabled=true,worstValue=<null>,bestValue=<null>,optimizedBestValue=false,hidden=false,deleteHistoricalData=false,decimalScale=<null>],value=12,fromCore=false]
at org.sonar.scanner.sensor.DefaultSensorStorage.saveMeasure(DefaultSensorStorage.java:298)
at org.sonar.scanner.sensor.DefaultSensorStorage.store(DefaultSensorStorage.java:236)
at org.sonar.api.batch.sensor.measure.internal.DefaultMeasure.doSave(DefaultMeasure.java:95)
at org.sonar.api.batch.sensor.internal.DefaultStorable.save(DefaultStorable.java:45)
at com.lingtian.sonar.utils.api.visitors.metrics.MetricsVisitor.saveMetricOnFile(MetricsVisitor.java:56)
at com.lingtian.sonar.utils.api.visitors.metrics.MetricsVisitor.leaveFile(MetricsVisitor.java:41)
at com.lingtian.sonar.utils.astvisitor.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:44)
at com.lingtian.sonar.sensor.ConfigFileScanSensor.scanFile(ConfigFileScanSensor.java:152)
at com.lingtian.sonar.sensor.ConfigFileScanSensor.analyzeFile(ConfigFileScanSensor.java:124)
... 31 more
再次调用了sensorContext.<T>newMeasure().withValue(value).forMetric(metric).on(inputFile).save();
@Override
public void leaveFile(Tree tree) {
LinesOfCodeVisitor linesOfCodeVisitor = new LinesOfCodeVisitor(tree);
saveMetricOnFile(CoreMetrics.NCLOC, linesOfCodeVisitor.getNumberOfLinesOfCode());
CommentLinesVisitor commentLinesVisitor = new CommentLinesVisitor(tree);
saveMetricOnFile(CoreMetrics.COMMENT_LINES, commentLinesVisitor.getNumberOfCommentLines());
StatementsVisitor statementsVisitor = new StatementsVisitor(tree);
saveMetricOnFile(CoreMetrics.STATEMENTS, statementsVisitor.getNumberOfStatements());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private <T extends Serializable> void saveMetricOnFile(Metric metric, T value) {
sensorContext.<T>newMeasure()
.withValue(value)
.forMetric(metric)
.on(inputFile)
.save();
}
DefaultHighlighting报错:
Caused by: java.lang.UnsupportedOperationException: Trying to save highlighting twice for the
same file is not supported: src/main/resources/application-dev.properties
at org.sonar.scanner.sensor.DefaultSensorStorage.
store(DefaultSensorStorage.java:432)
at org.sonar.api.batch.sensor.highlighting.internal.
DefaultHighlighting.doSave(DefaultHighlighting.java:121)
at org.sonar.api.batch.sensor.internal.
DefaultStorable.save(DefaultStorable.java:45)
at com.lingtian.sonar.utils.api.visitors.SyntaxHighlighterVisitor.
leaveFile(SyntaxHighlighterVisitor.java:50)
at com.lingtian.sonar.utils.astvisitor.SubscriptionVisitor.
scanTree(SubscriptionVisitor.java:46)
at com.lingtian.sonar.sensor.ConfigFileScanSensor.
scanFile(ConfigFileScanSensor.java:152)
at com.lingtian.sonar.sensor.ConfigFileScanSensor.
analyzeFile(ConfigFileScanSensor.java:124)
... 31 more
再次调用了:
@Override
public void visitFile(Tree tree) {
highlighting = sensorContext.newHighlighting().onFile(fileSystem.inputFile(fileSystem.predicates().is(getContext().getFile())));
}
本文详细解析了SonarQube中sensorContext的使用原则,特别强调了DefaultHighlighting和DefaultMeasure的唯一性限制,避免重复设置导致的UnsupportedOperationException错误。通过具体代码示例,展示了如何正确应用sensorContext进行代码质量分析。
5133

被折叠的 条评论
为什么被折叠?



