- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个自定义 SonarQube 插件来创建项目特定的规则集。自定义规则已编写,并且该规则正在使用 JUnit 成功执行。以下是自定义 Sonar 规则。
@Rule(key = StringConstants.AVOID_SOCKETS_API_KEY)
public class AvoidSocketsApiRule extends IssuableSubscriptionVisitor {
@Override
public List<Tree.Kind> nodesToVisit() {
return ImmutableList.of(Tree.Kind.VARIABLE);
}
@Override
public void visitNode(final Tree tree) {
final VariableTree variableTree = (VariableTree) tree;
final Type type = variableTree.symbol().type();
if (type.is(StringConstants.SOCKET_CHANNEL) || type.is(StringConstants.SERVER_SOCKET_CHANNEL)
|| type.is(StringConstants.ASYNC_SOCKET_CHANNEL) || type.is(StringConstants.ASYNC_SERVER_SOCKET_CHANNEL)) {
this.reportIssue(variableTree.simpleName(), StringConstants.AVOID_SOCKETS_API_MESSAGE);
}
}
}
当我将应用程序打包到 Sonar 插件并部署到 Sonar 库时,它给了我一个非法状态异常。我能够使用 Junit 复制该问题。
@Test
public void test() {
final CustomRulesDefinition rulesDefinition = new CustomRulesDefinition();
final RulesDefinition.Context context = new RulesDefinition.Context();
rulesDefinition.define(context);
final RulesDefinition.Repository repository = context.repository(StringConstants.REPOSITORY_KEY);
assertThat(repository.name()).isEqualTo(StringConstants.REPOSITORY_NAME);
assertThat(repository.language()).isEqualTo(StringConstants.LANG);
assertThat(repository.rules()).hasSize(RulesList.getChecks().size());
this.assertAllRuleParametersHaveDescription(repository);
}
private void assertAllRuleParametersHaveDescription(final Repository repository) {
for (final Rule rule : repository.rules()) {
for (final Param param : rule.params()) {
assertThat(param.description()).as("description for " + param.key()).isNotEmpty();
}
}
}
下面提供了显示的错误。我无法找到修复方法,感谢您在此提供的意见。
java.lang.IllegalStateException: Name of rule [repository=custom-ruleset, key=AvoidSocketsApi] is empty
at org.sonar.api.server.rule.RulesDefinition$NewRule.validate(RulesDefinition.java:888)
at org.sonar.api.server.rule.RulesDefinition$NewRule.access$800(RulesDefinition.java:659)
at org.sonar.api.server.rule.RulesDefinition$RepositoryImpl.<init>(RulesDefinition.java:566)
at org.sonar.api.server.rule.RulesDefinition$RepositoryImpl.<init>(RulesDefinition.java:540)
at org.sonar.api.server.rule.RulesDefinition$Context.registerRepository(RulesDefinition.java:436)
at org.sonar.api.server.rule.RulesDefinition$Context.access$500(RulesDefinition.java:380)
at org.sonar.api.server.rule.RulesDefinition$NewRepositoryImpl.done(RulesDefinition.java:512)
at com.deloitte.sonar.java.CustomRulesDefinition.define(CustomRulesDefinition.java:83)
at com.deloitte.sonar.java.CustomRulesDefinitionTest.test(CustomRulesDefinitionTest.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
下面是pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<sonar.plugin.api.version>5.6</sonar.plugin.api.version>
<java.plugin.version>4.2</java.plugin.version>
<junit.version>4.12</junit.version>
<sslr.version>1.21</sslr.version>
<gson.version>2.6.2</gson.version>
<slf4j.version>1.6.2</slf4j.version>
<logback.version>0.9.30</logback.version>
<fest.assert.version>1.4</fest.assert.version>
</properties>
<dependencies>
<dependency>
<groupId>org.sonarsource.sonarqube</groupId>
<artifactId>sonar-plugin-api</artifactId>
<version>${sonar.plugin.api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonarsource.java</groupId>
<artifactId>sonar-java-plugin</artifactId>
<version>${java.plugin.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonarsource.java</groupId>
<artifactId>java-frontend</artifactId>
<version>${java.plugin.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonarsource.sslr-squid-bridge</groupId>
<artifactId>sslr-squid-bridge</artifactId>
<version>2.6.1</version>
<exclusions>
<exclusion>
<groupId>org.sonarsource.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>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>org.sonarsource.java</groupId>
<artifactId>java-checks-testkit</artifactId>
<version>${java.plugin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.sonarsource.sslr</groupId>
<artifactId>sslr-testing-harness</artifactId>
<version>${sslr.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>${fest.assert.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</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>
<pluginClass>com.suraj.sonar.java.RulesPlugin</pluginClass>
<pluginDescription>Plugin for custom rules</pluginDescription>
<pluginOrganizationName>Suraj</pluginOrganizationName>
<pluginOrganizationUrl>surajmuraleedharanc.com</pluginOrganizationUrl>
<sonarLintSupported>true</sonarLintSupported>
<sonarQubeMinVersion>${sonar.plugin.api.version}</sonarQubeMinVersion>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
最佳答案
您问题的关键似乎是:为什么我的规则通过单元测试起作用,但通过 SonarQube 服务器引发异常?
您的单元测试只是执行一些逻辑。它不知道也不关心“规则”的概念。
但是服务器处理的不是逻辑,而是规则(规则本身包含逻辑)。根据定义,规则必须有一个名称(除其他外)。 The custom rule quick start guide给出了详细信息,但本质上,您需要添加以下内容:
@Rule(
key = "avoidSocketsApi",
name = "The \"Sockets\" API should not be used",
description = "...",
priority = Priority.CRITICAL,
tags = {"bug"})
public class AvoidSocketsApiRule extends IssuableSubscriptionVisitor {
关于java - SonarQube 自定义插件,启动失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40048316/
我找到了 Using SonarQube in Eclipse 并将提出一个针对 Python 的单独问题。但在这里我想更一般地询问如何在提交之前处理单个源文件时,如何使用 SonarQube 作为
我们之前在现已关闭的 SonarQube Users mailing list 上讨论过这个问题. 通过优化Postgre DB换了半周左右问题解决,然后又出现问题。 我们正在使用 Jenkins 1
自从更新到5.x以来,由于“权限不足”问题,我们的许多构建作业现在都失败了。如here中所述,应该在SonarQube 5.1中解决该问题,但实际上它没有得到解决,或者存在另一个与我们当前运行Sona
我已经有一段时间没有看过 SonarQube 了。最新版本看起来很有趣。 上次我查看这个产品时,他们有一个网站,他们通过 SonarQube 进程推送了各种流行的开源库(如 Tomcat、Active
在 SonarQube (5.6.4 LTS) 中有一个后台(项目分析)任务可视化的 View :(管理/项目/后台任务)。似乎任务是按顺序运行的(一次一个)。有些任务可能需要 40 分钟,这意味着其
今天我正在用 mysqldump 备份 MySQL,但我不确定是否需要从/opt/sonar 保存一些文件。请你能帮我一些指示吗? 除了 MySQL,我还需要在 Sonar 中备份什么? 最佳答案 我
我们希望每个用户都能收到一封关于他们在此分析中引入的新问题的电子邮件。 我在这里找到了这个请求,说它应该已经成为可能: http://jira.sonarsource.com/browse/SONAR
是否可以从一个项目导出代码覆盖率和 sonarqube 问题的排除项并导入到其他项目? 最佳答案 排除项是项目属性,因此您可以使用 /api/properties Web 服务自动从一个项目获取这些属
当 Sonar 抛出一个特定的编码规则违规时,开发人员(或就此而言任何授权用户)如何忽略它?假设弹出一条规则“不遵循文件命名约定”,有没有办法可以将其声明为误报并单击某个按钮以确保不会显示该编码规则违
我希望更改规则“左花括号应位于代码行的末尾”,因为我们使用了不同的约定。 提前致谢! 最佳答案 由于 Sonarqube 打算在规则上提供尽可能少的配置:您应该使用 key squid:LeftCur
我正在寻找一种在 SonarQube 中组织项目的方法,并发现我必须为此付费:http://www.sonarqube.org/bring-a-new-dimension-to-sonar-with-
SonarQube Server 5.1.2, Sonar-Runner 2.4 正如 Multi-moduleProject 中提供的那样我创建了一个项目结构 Accounts | ->invoic
在 SonarQube 的 Web UI 中,您可以根据多个条件过滤问题。但似乎没有一个是可以否定的。 我喜欢找出所有关键问题,即 不是 规则xyz。我目前从 Web UI 中只能看到选择我喜欢看的东
我已经设置了一个 jenkins-sonarqube-github 集成工作流程,其中 git 存储库中的拉取请求会触发一个 webhook,该 webhook 会启动一个 jenkins 作业,该作
有没有人设法让 SonarQube 与 Upsource 合作?我已经为 SonarQube 下载了 upsource-sonar-plugin-0.1-SNAPSHOT.jar 插件,并在我通过/s
我正在使用JaCoCo进行代码覆盖。单元测试报告是使用junit创建的,并且已正确导入,因此可以正确显示单元测试信息。 问题是,我收到错误消息: 没有有关每次测试的覆盖率的信息。 ,代码覆盖率显示单元
我有一个 Sonarcloud 帐户,我正在尝试使用 SonarQube.Scanner.MSBuild.exe 分析 Visual Studio 解决方案。我创建了一个 token 并将其作为 So
似乎有最新版本的新规则可用。 我有几个问题报告为“应正确使用 Printf 样式的格式字符串 (squid:S3457)” 我不明白 my case 中的描述和错误是什么: LOGGER.info("
这个问题我看了很多帖子,但是没找到答案所以才问。我将 Sonarqube 从 4.5 升级到 5.6,它工作正常,但质量配置文件是空的。我尝试使用备份/恢复选项恢复一个,但规则被忽略: image .
我实现了 SonarQube在服务器上,我做了大部分配置 远程 .因此,无论何时安装插件,都会重新启动 SonarQube是必需的,每次我都必须显式(手动)重启 SonarQube服务器 . 有没有办
我是一名优秀的程序员,十分优秀!