我正在编写Sonarqube Java自定义规则,但在尝试分析代码时一直出现此错误:
" SonarQube无法分析文件'文件路径' org.sonar.java.resolve.JavaSymbol $ TypeJavaSymbol无法强制转换为 org.sonar.java.resolve.JavaSymbol $ TypeJavaSymbol"
如您所见,原始类型和类型具有相同的限定名称。因此我认为这只能是ClassLoader着色问题。
您可以在此处找到完整的代码作为开源代码: https://github.com/oasp-forge/sonarqube-devon-plugin(如果您想检查POM或规则类)。
以下是导致此问题的规则代码:
package io.oasp.ide.sonarqube.common.impl;
import io.oasp.module.basic.common.api.reflect.OaspPackage;
@Rule(key = "ArchitecturePackageCheck", name = "My Package Check", description = "Verify that the code is following My package conventions.", //
priority = Priority.MAJOR, tags = { "bug" })
public class ArchitecturePackageCheck extends BaseTreeVisitor implements JavaFileScanner {
private List<String> issues;
private String fullyQualifiedName;
/**
* The constructor.
*/
public DevonArchitecturePackageCheck() {
super();
this.issues = new ArrayList<>();
}
/**
* @return fullyQualifiedName
*/
public String getFullyQualifiedName() {
return this.fullyQualifiedName;
}
@Override
public void scanFile(JavaFileScannerContext context) {
this.issues.clear();
scan(context.getTree());
for (String issue : this.issues) {
int lineNumber = 1;
context.addIssue(lineNumber, this, issue);
}
}
@Override
public void visitIdentifier(IdentifierTree tree) {
// TODO Auto-generated method stub
super.visitIdentifier(tree);
}
@Override
public void visitClass(ClassTree tree) {
this.fullyQualifiedName = ((JavaSymbol.TypeJavaSymbol) tree.symbol()).getFullyQualifiedName();
String packageName = " ";
int lastDot = this.fullyQualifiedName.lastIndexOf('.');
if (lastDot > 0) {
packageName = this.fullyQualifiedName.substring(0, lastDot);
}
if (packageName.isEmpty()) {
this.issues.add("Invalid Package IS EMPTY!" + packageName + " !");
} else {
OaspPackage pkg = OaspPackage.of(packageName);
if (!pkg.isValid()) {
this.issues.add("Invalid Package IS VALID" + packageName + " !");
}
}
}
}
答案 0 :(得分:1)
是的,这很可能与类加载器问题有关,您不应该使用未使用公共API公开的类,即包org.sonar.plugins.java.api
之外的任何类。
从ClassTree
获取完全限定名称的正确方法是使用Type
类,可以从这样的符号访问
classTree.symbol().type().fullyQualifiedName()