手动写sonar 插件
生活随笔
收集整理的這篇文章主要介紹了
手动写sonar 插件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
類結構目錄:
pom 依賴:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.suning.devops</groupId><artifactId>uranus-rsf-sonar-plugin</artifactId><version>1.0.0</version><packaging>sonar-plugin</packaging><name>uranus-rsf-sonar-plugin</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><sonar.version>6.3</sonar.version><java.plugin.version>4.7.1.9272</java.plugin.version><sslr.version>1.21</sslr.version><gson.version>2.6.2</gson.version><log4j.version>1.2.17</log4j.version><slf4j.version>1.7.25</slf4j.version></properties><dependencies><dependency><groupId>org.sonarsource.sonarqube</groupId><artifactId>sonar-plugin-api</artifactId><version>${sonar.version}</version><scope>provided</scope></dependency><dependency><groupId>org.sonarsource.java</groupId><artifactId>sonar-java-plugin</artifactId><type>sonar-plugin</type><version>${java.plugin.version}</version></dependency><dependency><groupId>org.sonarsource.java</groupId><artifactId>java-frontend</artifactId><version>${java.plugin.version}</version></dependency><dependency><groupId>org.sonarsource.sslr-squid-bridge</groupId><artifactId>sslr-squid-bridge</artifactId><version>2.6.1</version><exclusions><exclusion><groupId>org.codehaus.sonar.sslr</groupId><artifactId>sslr-core</artifactId></exclusion><exclusion><groupId>org.codehaus.sonar</groupId><artifactId>sonar-plugin-api</artifactId></exclusion><exclusion><groupId>org.codehaus.sonar.sslr</groupId><artifactId>sslr-xpath</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.sonarsource.java</groupId><artifactId>java-checks-testkit</artifactId><version>${java.plugin.version}</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>${gson.version}</version></dependency><dependency><groupId>org.sonarsource.sslr</groupId><artifactId>sslr-testing-harness</artifactId><version>${sslr.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.6.1</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>0.9.30</version></dependency></dependencies><build><plugins><plugin><groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId><artifactId>sonar-packaging-maven-plugin</artifactId><version>1.17</version><extensions>true</extensions><configuration><pluginDescription>Scanner rsf deprecated method usage</pluginDescription><pluginKey>java-custom</pluginKey><pluginName>RSF Deprecated Method Check Rules</pluginName><pluginClass>com.suning.devops.sonar.RSFDeprecatedMethodPlugin</pluginClass><sonarLintSupported>true</sonarLintSupported><sonarQubeMinVersion>5.6</sonarQubeMinVersion> <!-- allow to depend on API 6.x but run on LTS --></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.0</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.0.1</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>target/lib</outputDirectory><overWriteSnapshots>true</overWriteSnapshots></configuration></execution></executions></plugin></plugins></build> </project>RSFDeprecatedMethodDefinition代碼:
package com.suning.devops.sonar.definition;import com.suning.devops.sonar.rules.UranusRulesList; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.server.rule.RulesDefinition.Context; import org.sonar.api.server.rule.RulesDefinition.NewRepository; import org.sonar.squidbridge.annotations.AnnotationBasedRulesDefinition;public class RSFDeprecatedMethodDefinitionimplements RulesDefinition {public static final String REPOSITORY_KEY = "UranusRepo";public void define(RulesDefinition.Context context){RulesDefinition.NewRepository repository = context.createRepository("UranusRepo", "java");repository.setName("rsf服務方法調用");AnnotationBasedRulesDefinition.load(repository, "java", UranusRulesList.getChecks());repository.done();} }RSFDeprecatedMethodRegistrar類代碼:
package com.suning.devops.sonar.registrar;import com.suning.devops.sonar.rules.RSFDeprecatedMethodCheck; import java.util.Arrays; import org.sonar.plugins.java.api.CheckRegistrar; import org.sonar.plugins.java.api.CheckRegistrar.RegistrarContext; import org.sonar.plugins.java.api.JavaCheck;public class RSFDeprecatedMethodRegistrarimplements CheckRegistrar {public void register(CheckRegistrar.RegistrarContext registrarContext){registrarContext.registerClassesForRepository("UranusRepo", Arrays.asList(checkClasses()), Arrays.asList(testCheckClasses()));}public static Class<? extends JavaCheck>[] checkClasses(){return new Class[] { RSFDeprecatedMethodCheck.class };}public static Class<? extends JavaCheck>[] testCheckClasses(){return new Class[0];} }RSFDeprecatedMethodCheck類代碼:
package com.suning.devops.sonar.rules;import com.google.common.collect.ImmutableList; import java.io.PrintStream; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.check.Priority; import org.sonar.check.Rule; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.JavaFileScanner; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.semantic.Symbol; import org.sonar.plugins.java.api.semantic.SymbolMetadata; import org.sonar.plugins.java.api.semantic.SymbolMetadata.AnnotationInstance; import org.sonar.plugins.java.api.semantic.Type; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.IdentifierTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.Tree.Kind; import org.sonar.squidbridge.annotations.SqaleConstantRemediation; import org.sonar.squidbridge.annotations.SqaleSubCharacteristic;@Rule(key="RSFDeprecatedMethodCheck", name="由于版本不兼容,不能使用RSF接口中的過期方法", description="建議將過期方法去除,否則有可能出現事故", tags={"rsf-deprecated-method"}, priority=Priority.MINOR) @SqaleSubCharacteristic("ARCHITECTURE_CHANGEABILITY") @SqaleConstantRemediation("10min") public class RSFDeprecatedMethodCheckextends IssuableSubscriptionVisitorimplements JavaFileScanner {private static final Logger LOGGER = LoggerFactory.getLogger(RSFDeprecatedMethodCheck.class);private JavaFileScannerContext context;public List<Tree.Kind> nodesToVisit(){return ImmutableList.of(Tree.Kind.CLASS, Tree.Kind.METHOD_INVOCATION);}public void scanFile(JavaFileScannerContext context){this.context = context;super.scanFile(context);}public void visitNode(Tree tree){if (tree == null){super.visitNode(tree);return;}if ((tree instanceof ClassTree)){ClassTree classTree = (ClassTree)tree;System.out.println("-------------------------\n\r" + classTree.simpleName().name());}if ((tree instanceof MethodInvocationTree)){MethodInvocationTree methodInvocationTree = (MethodInvocationTree)tree;Symbol symbol = methodInvocationTree.symbol();Symbol owner = symbol.owner();System.out.println("begin analyze " + methodInvocationTree + "----" + symbol + "---" + owner + "---" + owner.type() + "-----" + owner.type().fullyQualifiedName());if (owner.type().fullyQualifiedName().equals("com.suning.rsf.consumer.ServiceAgent")){SymbolMetadata metadata = symbol.metadata();List<SymbolMetadata.AnnotationInstance> annotations = metadata.annotations();for (SymbolMetadata.AnnotationInstance annotationInstance : annotations) {if (annotationInstance.symbol().type(). fullyQualifiedName().equals("java.lang.Deprecated")) {this.context.reportIssue(this, tree, "不能使用!");}}}super.visitNode(tree);}} }UranusRulesList類代碼:
package com.suning.devops.sonar.rules;import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import java.util.List; import org.sonar.plugins.java.api.JavaCheck;public class UranusRulesList {public static List<Class> getChecks(){return ImmutableList.builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build();}public static List<Class<? extends JavaCheck>> getJavaChecks(){return ImmutableList.builder().add(RSFDeprecatedMethodCheck.class).build();}public static List<Class<? extends JavaCheck>> getJavaTestChecks(){return ImmutableList.builder().build();} }RSFDeprecatedMethodPlugin代碼:
package com.suning.devops.sonar;import com.suning.devops.sonar.definition.RSFDeprecatedMethodDefinition; import com.suning.devops.sonar.profile.RSFDeprecatedMethodProfileDefinition; import com.suning.devops.sonar.registrar.RSFDeprecatedMethodRegistrar; import org.sonar.api.Plugin; import org.sonar.api.Plugin.Context;public class RSFDeprecatedMethodPluginimplements Plugin {public void define(Plugin.Context context){context.addExtension(RSFDeprecatedMethodDefinition.class);context.addExtension(RSFDeprecatedMethodRegistrar.class);context.addExtension(RSFDeprecatedMethodProfileDefinition.class);} }profile xml:
<?xml version="1.0" encoding="utf-8" ?> <profile><language>java</language><name>Uranus Custom Quality</name><rules><rule><repositoryKey>UranusRepo</repositoryKey><key>ComponentsMustNotBeFollowedByComponentsRule</key><priority>MAJOR</priority></rule></rules> </profile>html :?
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body></body> </html>對應的json 文件:
{"title": "不能使用RSF服務中的com.suning.rsf.consumer.ServiceAgent類中的過時的方法","status": "ready","remediation": {"func": "Constant\/Issue","constantCost": "5min"},"tags": ["bug","pitfall"],"defaultSeverity": "CRITICAL" }這個插件識別 java 中過期的api 接口。
?
?
?
?
總結
以上是生活随笔為你收集整理的手动写sonar 插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DirectX是什么
- 下一篇: SonarQube6.7规则的启用和禁用