2015-01-14 2 views
2

custom rule 코드 스 니펫을 사용하여 맞춤 규칙 플러그인을 만들었습니다. 익명의 클래스가 30 행 이상일 때 오류를 표시하는 또 다른 규칙을 추가했습니다. mvn package 명령을 사용하여 사용자 정의 규칙 플러그인 jar를 빌드하고 sonar 서버 확장/플러그인에 넣고 서버를 다시 시작했습니다. 내 대응 규칙은 sonar 서버에서 볼 수 있지만 loc> 30 행을 가진 익명 클래스가 있지만 규칙은 코드를 분석 할 수 없습니다. 나의 주문 규칙은 아래에 주어진다.음파 탐지기 4.5.1 컷오프 규칙 플러그인이 작동하지 않습니다.

@Rule(
    key = AnonymousClassesTooBigCheck.KEY, 
    name = "Avoid too big classes", 
    description = "avoid too bid classes", 
    tags = {"brain-overload"}, 
    priority = Priority.MAJOR) 
@BelongsToProfile(title = "Sonar way", priority = Priority.MAJOR) 
public class AnonymousClassesTooBigCheck extends BaseTreeVisitor implements JavaFileScanner { 
public static final String KEY = "AD0001"; 
    private static final RuleKey RULE_KEY = RuleKey.of(MyJavaRulesDefinition.REPOSITORY_KEY, KEY); 
    private static final int DEFAULT_MAX = 30; 

    @RuleProperty(defaultValue = "" + DEFAULT_MAX) 
    public int max = DEFAULT_MAX; 

    private JavaFileScannerContext context; 
    /** 
    * Flag to skip check for class bodies of EnumConstants. 
    */ 
    private boolean isEnumConstantBody; 

    @Override 
    public void scanFile(JavaFileScannerContext context) { 
    this.context = context; 
    isEnumConstantBody = false; 
    scan(context.getTree()); 
    } 

    @Override 
    public void visitNewClass(NewClassTree tree) { 
    if (tree.classBody() != null && !isEnumConstantBody) { 
     int lines = getNumberOfLines(tree.classBody()); 
     if (lines > max) { 
     context.addIssue(tree, RULE_KEY, "Reduce this anonymous class number of lines from " + lines + " to at most " + max + ", or make it a named class."); 
     } 
    } 
    isEnumConstantBody = false; 
    super.visitNewClass(tree); 
    } 

    @Override 
    public void visitEnumConstant(EnumConstantTree tree) { 
    isEnumConstantBody = true; 
    super.visitEnumConstant(tree); 
    } 

    @Override 
    public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { 
    int lines = getNumberOfLines(((JavaTree) lambdaExpressionTree.body()).getAstNode()); 
    if (lines > max) { 
     context.addIssue(lambdaExpressionTree, RULE_KEY, "Reduce this lambda expression number of lines from " + lines + " to at most " + max + "."); 
    } 
    super.visitLambdaExpression(lambdaExpressionTree); 
    } 

    private int getNumberOfLines(ClassTree classTree) { 
    int startLine = ((InternalSyntaxToken) classTree.openBraceToken()).getLine(); 
    int endline = ((InternalSyntaxToken) classTree.closeBraceToken()).getLine(); 
    return endline - startLine + 1; 
    } 

    private int getNumberOfLines(AstNode node) { 
    return node.getLastToken().getLine() - node.getTokenLine() + 1; 
    } 

} 

이제 규칙을 실행하기 위해 더 많은 작업을 수행해야합니까?

한 가지 더 내가 mvn sonar:sonar 오류를 사용하여 분석기를 실행하면 플러그인 폴더에 플러그인 항아리를 넣어 후

Embedded error: org/sonar/java/model/InternalSyntaxToken 
org.sonar.java.model.InternalSyntaxToken 
[INFO] ------------------------------------------------------------------------ 
[INFO] Trace 
org.apache.maven.lifecycle.LifecycleExecutionException: Can not execute Sonar 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:284) 
     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:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     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) 
Caused by: org.apache.maven.plugin.MojoExecutionException: Can not execute Sonar 
     at org.codehaus.mojo.sonar.Bootstraper.executeMojo(Bootstraper.java:103) 
     at org.codehaus.mojo.sonar.Bootstraper.start(Bootstraper.java:79) 
     at org.codehaus.mojo.sonar.SonarMojo.execute(SonarMojo.java:88) 
     at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
     ... 17 more 
Caused by: org.apache.maven.plugin.MojoExecutionException: org/sonar/java/model/InternalSyntaxToken 
     at org.sonar.maven.ExceptionHandling.handle(ExceptionHandling.java:37) 
     at org.sonar.maven.SonarMojo.execute(SonarMojo.java:175) 
     at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
     at org.codehaus.mojo.sonar.Bootstraper.executeMojo(Bootstraper.java:98) 
     ... 21 more 
Caused by: java.lang.NoClassDefFoundError: org/sonar/java/model/InternalSyntaxToken 
     at org.sonar.samples.java.AnonymousClassesTooBigCheck.getNumberOfLines(AnonymousClassesTooBigCheck.java:78) 
     at org.sonar.samples.java.AnonymousClassesTooBigCheck.visitNewClass(AnonymousClassesTooBigCheck.java:53) 
     at org.sonar.java.model.expression.NewClassTreeImpl.accept(NewClassTreeImpl.java:126) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitVariable(BaseTreeVisitor.java:291) 
     at org.sonar.java.model.declaration.VariableTreeImpl.accept(VariableTreeImpl.java:180) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitClass(BaseTreeVisitor.java:69) 
     at org.sonar.java.model.declaration.ClassTreeImpl.accept(ClassTreeImpl.java:201) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitClass(BaseTreeVisitor.java:69) 
     at org.sonar.java.model.declaration.ClassTreeImpl.accept(ClassTreeImpl.java:201) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:36) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitCompilationUnit(BaseTreeVisitor.java:55) 
     at org.sonar.java.model.JavaTree$CompilationUnitTreeImpl.accept(JavaTree.java:202) 
     at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:42) 
     at org.sonar.samples.java.AnonymousClassesTooBigCheck.scanFile(AnonymousClassesTooBigCheck.java:47) 
     at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123) 
     at com.sonar.sslr.impl.ast.AstWalker.walkAndVisit(AstWalker.java:67) 
     at org.sonar.java.ast.AstScanner.simpleScan(AstScanner.java:107) 
     at org.sonar.java.ast.AstScanner.scan(AstScanner.java:75) 
     at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:122) 
     at org.sonar.java.JavaSquid.scan(JavaSquid.java:115) 
     at org.sonar.plugins.java.JavaSquidSensor.analyse(JavaSquidSensor.java:91) 
     at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:79) 
     at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:70) 
     at org.sonar.batch.phases.PhaseExecutor.execute(PhaseExecutor.java:119) 
     at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:194) 
     at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) 
     at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77) 
     at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:233) 
     at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:228) 
     at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:221) 
     at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) 
     at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77) 
     at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:64) 
     at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:51) 
     at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:125) 
     at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92) 
     at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77) 
     at org.sonar.batch.bootstrap.BootstrapContainer.executeTask(BootstrapContainer.java:173) 
     at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95) 
     at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67) 
     at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87) 
     at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69) 
     at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50) 
     at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102) 
     at org.sonar.runner.api.Runner.execute(Runner.java:100) 
     at org.sonar.maven.SonarMojo.execute(SonarMojo.java:173) 
     ... 23 more 
Caused by: java.lang.ClassNotFoundException: org.sonar.java.model.InternalSyntaxToken 
     at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:259) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:235) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:227) 
     ... 82 more 

답변

0

이 오류가 AnonymousClassesTooBigCheck의 코드는 내부 API를 사용하고 있다는 점이다 발생할 이유를 occures , 여기 InternalSyntaxToken은 직접적으로 사용되어서는 안되며 런타임에서 실패합니다 (custom rule 코드 예제의 어떤 것도이 클래스를 사용하지 않음을 알 수 있습니다).

관련 문제