版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lxlmycsdnfree/article/details/89787483
sonar 自定义一种语言报错:
2019.05.03 04:00:50 WARN web[][o.s.s.q.BuiltInQProfileDefinitionsBridge] Rule not found:
[repository=configFiles, key=ConfigFiles-User-Check]
2019.05.03 04:00:50 INFO web[][o.s.s.q.BuiltInQProfileRepositoryImpl] Language
configFiles is not installed,related quality profiles are ignored
2019.05.03 04:00:50 ERROR web[][o.s.s.p.Platform] Background initialization failed.
Stopping SonarQube
java.lang.IllegalStateException: The following languages have no built-in quality
profiles: configfiles
at com.google.common.base.Preconditions.checkState(Preconditions.java:197)
at org.sonar.server.qualityprofile.BuiltInQProfileRepositoryImpl.
ensureAllLanguagesHaveAtLeastOneBuiltInQP
(BuiltInQProfileRepositoryImpl.java:100)
atorg.sonar.server.qualityprofile.BuiltInQProfileRepositoryImpl.initialize
(BuiltInQProfileRepositoryImpl.java:82) at org.sonar.server.qualityprofile.BuiltInQProfileLoader.start
(BuiltInQProfileLoader.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
新定义的语言:configfiles,必须实现BuiltInQualityProfilesDefinition
扩展点;
以列出默认情况下应为您的语言启用的规则。可以参考 https://github.com/SonarSource/sonar-custom-plugin-example
注意:BuiltInQualityProfilesDefinition 只有6.7以上版本才有的接口
package org.sonarsource.plugins.example.languages;
import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition;
import static org.sonarsource.plugins.example.rules.FooLintRulesDefinition.REPO_KEY;
/**
* Default, BuiltIn Quality Profile for the projects having files of the language "foo"
*/
public final class FooQualityProfile implements BuiltInQualityProfilesDefinition {
@Override
public void define(Context context) {
NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile("FooLint Rules", FooLanguage.KEY);
profile.setDefault(true);
NewBuiltInActiveRule rule1 = profile.activateRule(REPO_KEY, "ExampleRule1");
rule1.overrideSeverity("BLOCKER");
NewBuiltInActiveRule rule2 = profile.activateRule(REPO_KEY, "ExampleRule2");
rule2.overrideSeverity("MAJOR");
NewBuiltInActiveRule rule3 = profile.activateRule(REPO_KEY, "ExampleRule3");
rule3.overrideSeverity("CRITICAL");
profile.done();
}
}
rules:
package org.sonarsource.plugins.example.rules;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
import org.sonarsource.plugins.example.languages.FooLanguage;
public final class FooLintRulesDefinition implements RulesDefinition {
private static final String PATH_TO_RULES_XML = "/example/foolint-rules.xml";
protected static final String KEY = "foolint";
protected static final String NAME = "FooLint";
public static final String REPO_KEY = FooLanguage.KEY + "-" + KEY;
protected static final String REPO_NAME = FooLanguage.KEY + "-" + NAME;
protected String rulesDefinitionFilePath() {
return PATH_TO_RULES_XML;
}
private void defineRulesForLanguage(Context context, String repositoryKey, String repositoryName, String languageKey) {
NewRepository repository = context.createRepository(repositoryKey, languageKey).setName(repositoryName);
InputStream rulesXml = this.getClass().getResourceAsStream(rulesDefinitionFilePath());
if (rulesXml != null) {
RulesDefinitionXmlLoader rulesLoader = new RulesDefinitionXmlLoader();
rulesLoader.load(repository, rulesXml, StandardCharsets.UTF_8.name());
}
repository.done();
}
@Override
public void define(Context context) {
defineRulesForLanguage(context, REPO_KEY, REPO_NAME, FooLanguage.KEY);
}
}
对应rules.xml:
<foolint-rules>
<rule>
<key>ExampleRule1</key>
<name>Example Rule 1</name>
<internalKey>ExampleRule1</internalKey>
<description>This is an example of rule defined thru the XML.
</description>
<severity>BLOCKER</severity>
<cardinality>SINGLE</cardinality>
<status>READY</status>
<type>BUG</type>
<tag>example</tag>
<remediationFunction>CONSTANT_ISSUE</remediationFunction>
<remediationFunctionBaseEffort>2min</remediationFunctionBaseEffort>
</rule>
<rule>
<key>ExampleRule2</key>
<name>Example Rule 2</name>
<internalKey>ExampleRule2</internalKey>
<description>This is a other example of rule defined thru the XML.
</description>
<severity>MAJOR</severity>
<cardinality>SINGLE</cardinality>
<status>BETA</status>
<type>CODE_SMELL</type>
<tag>example</tag>
<tag>convention</tag>
<remediationFunction>LINEAR</remediationFunction>
<remediationFunctionGapMultiplier>60min</remediationFunctionGapMultiplier>
</rule>
<rule>
<key>ExampleRule3</key>
<name>Example Rule 3</name> <!-- max size is 200 -->
<internalKey>ExampleRule3</internalKey>
<description>This is a other example of rule defined thru the XML.
</description>
<severity>CRITICAL</severity>
<cardinality>SINGLE</cardinality>
<status>DEPRECATED</status>
<type>VULNERABILITY</type>
<tag>example</tag>
<remediationFunction>LINEAR_OFFSET</remediationFunction>
<remediationFunctionGapMultiplier>10min</remediationFunctionGapMultiplier>
<remediationFunctionBaseEffort>30min</remediationFunctionBaseEffort>
</rule>
</foolint-rules>
plugin
package org.sonarsource.plugins.example;
import org.sonar.api.Plugin;
import org.sonar.api.config.PropertyDefinition;
import org.sonarsource.plugins.example.hooks.DisplayIssuesInScanner;
import org.sonarsource.plugins.example.hooks.DisplayQualityGateStatus;
import org.sonarsource.plugins.example.languages.FooLanguage;
import org.sonarsource.plugins.example.languages.FooQualityProfile;
import org.sonarsource.plugins.example.measures.ComputeSizeAverage;
import org.sonarsource.plugins.example.measures.ComputeSizeRating;
import org.sonarsource.plugins.example.measures.ExampleMetrics;
import org.sonarsource.plugins.example.measures.SetSizeOnFilesSensor;
import org.sonarsource.plugins.example.rules.CreateIssuesOnJavaFilesSensor;
import org.sonarsource.plugins.example.rules.FooLintIssuesLoaderSensor;
import org.sonarsource.plugins.example.rules.FooLintRulesDefinition;
import org.sonarsource.plugins.example.rules.JavaRulesDefinition;
import org.sonarsource.plugins.example.settings.FooLanguageProperties;
import org.sonarsource.plugins.example.settings.HelloWorldProperties;
import org.sonarsource.plugins.example.settings.SayHelloFromScanner;
import org.sonarsource.plugins.example.web.MyPluginPageDefinition;
import static java.util.Arrays.asList;
/**
* This class is the entry point for all extensions. It is referenced in pom.xml.
*/
public class ExamplePlugin implements Plugin {
@Override
public void define(Context context) {
// tutorial on hooks
// http://docs.sonarqube.org/display/DEV/Adding+Hooks
context.addExtensions(DisplayIssuesInScanner.class, DisplayQualityGateStatus.class);
// tutorial on languages
context.addExtensions(FooLanguage.class, FooQualityProfile.class);
context.addExtension(FooLanguageProperties.getProperties());
// tutorial on measures
context
.addExtensions(ExampleMetrics.class, SetSizeOnFilesSensor.class, ComputeSizeAverage.class, ComputeSizeRating.class);
// tutorial on rules
context.addExtensions(JavaRulesDefinition.class, CreateIssuesOnJavaFilesSensor.class);
context.addExtensions(FooLintRulesDefinition.class, FooLintIssuesLoaderSensor.class);
// tutorial on settings
context
.addExtensions(HelloWorldProperties.getProperties())
.addExtension(SayHelloFromScanner.class);
// tutorial on web extensions
context.addExtension(MyPluginPageDefinition.class);
context.addExtensions(asList(
PropertyDefinition.builder("sonar.foo.file.suffixes")
.name("Suffixes FooLint")
.description("Suffixes supported by FooLint")
.category("FooLint")
.defaultValue("")
.build()));
}
}