mvn声纳:声纳运行错误:无法强制转换为org.sonar.java.resolve.JavaSymbol $ TypeJavaSymbol

时间:2017-11-23 08:56:13

标签: java maven sonarqube classloader

我正在编写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 + " !");
      }
    }
  }

}

1 个答案:

答案 0 :(得分:1)

是的,这很可能与类加载器问题有关,您不应该使用未使用公共API公开的类,即包org.sonar.plugins.java.api之外的任何类。

ClassTree获取完全限定名称的正确方法是使用Type类,可以从这样的符号访问

classTree.symbol().type().fullyQualifiedName()