10

语境

我目前遇到由 maven 通过 jenkins 运行的 sonarqube 3.7 的问题

该项目设置为 maven 多模块项目,jenkins 使用以下参数运行声纳(通过 maven):“-pl”

我已将“sonar”3.6 更新为“sonarqube”3.7,并将“sonar-maven-plugin”更新为 3.7

问题

自更新以来,我在 jenkins (1.529) 中看到以下错误:

[ERROR] Failed to execute goal org.codehaus.sonar:sonar-maven-plugin:3.7:sonar (default-cli) on project xxxxx: Execution default-cli of goal org.codehaus.sonar:sonar-maven-plugin:3.7:sonar failed: Unable to execute Sonar: Maven session does not declare a top level project -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.sonar:sonar-maven-plugin:3.7:sonar (default-cli) on project xxxxx: Execution default-cli of goal org.codehaus.sonar:sonar-maven-plugin:3.7:sonar failed: Unable to execute Sonar
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    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:616)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-cli of goal org.codehaus.sonar:sonar-maven-plugin:3.7:sonar failed: Unable to execute Sonar
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:110)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: org.sonar.runner.impl.RunnerException: Unable to execute Sonar
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
    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:90)
    at org.sonar.maven.SonarMojo.execute(SonarMojo.java:172)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    ... 20 more
Caused by: java.lang.IllegalStateException: Maven session does not declare a top level project
    at org.sonar.plugins.maven.MavenProjectBootstrapper.bootstrap(MavenProjectBootstrapper.java:53)
    at org.sonar.batch.scan.ProjectScanContainer.projectBootstrap(ProjectScanContainer.java:104)
    at org.sonar.batch.scan.ProjectScanContainer.doBeforeStart(ProjectScanContainer.java:82)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:86)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:73)
    at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
    at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
    at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:82)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:88)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:73)
    at org.sonar.batch.bootstrap.BootstrapContainer.executeTask(BootstrapContainer.java:156)
    at org.sonar.batch.bootstrap.BootstrapContainer.doAfterStart(BootstrapContainer.java:144)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:88)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:73)
    at org.sonar.batch.bootstrapper.Batch.startBatch(Batch.java:92)
    at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:74)
    at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:45)
    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:616)
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
    ... 28 more

预期行为

声纳应该像以前版本一样检查代码

替代解决方案

如果我不使用 -pl 参数(它仅在我删除 sonarqube 中的项目时才有效)

但我仍然想只在特定模块上运行声纳。

4

5 回答 5

9

您会遇到我们许多重度 SonarQube 用户经常发现的问题:任何调用 SonarQube 的非标称技术都会在某些最终升级期间中断。我们在工作中已经习惯了它,以至于我们只是花时间将升级问题修复为 SonarQube 升级的成本。

我不怀疑这-pl在过去是有效的。但随着 SonarQube 继续针对多种语言工作它将摆脱其作为仅限 Java 和 Maven 的持续检查工具的根基。

当您将 SonarQube 作为 plain-jane 调用时,它是最快乐的mvn sonar:sonar。您应该在您的多模块父 POM 中指定额外的 SonarQube 配置,因为这是现在和将来都会兑现更改配置的唯一保证方式。

如果您只想针对一个模块运行 SonarQube,请设置sonar.includedModules为仅包含多模块父模块以及目标模块。因此,如果您的多模块父级<artifactId>foo-parent而您想要的模块是foo-module,则需要在foo-parent的 POM 中设置以下属性:

sonar.includedModules=foo-parent,foo-module

于 2013-09-06T04:05:22.190 回答
5

当我尝试通过以下命令运行声纳时,我遇到了同样的问题:-sonar:sonar -pl moduleA它在哪里寻找父模块,所以我尝试了这个并且它与 :- 一起使用sonar:sonar -pl .,moduleA。这将仅在多模块 maven 项目中构建一个特定项目,正如我们指定的“。” 它将构建解决问题的父 pom。

于 2018-10-02T22:01:37.423 回答
1

sonar.includedModules 自 4.3 起已弃用

https://docs.sonarqube.org/display/SONARQUBE53/Release+4.3+Upgrade+Notes

不推荐使用 sonar.skippedModules 和 sonar.includedModules 属性。它们应该被标准的 Maven 高级反应器选项所取代。例如,假设您有以下多模块项目:

 org.mycompany:my-project
     - moduleA (org.mycompany:module-A)
     - moduleB (org.mycompany:module-B)
     - moduleC (org.mycompany:module-C)

然后

mvn sonar:sonar -Dsonar.skippedModules=module-B 

应该被替换(从 Maven 3.2.1 开始)

mvn sonar:sonar -pl !moduleB
于 2016-01-27T09:45:35.963 回答
0

SonarQube 不支持 Maven '-pl' 选项,请参阅http://jira.codehaus.org/browse/SONAR-1742

于 2013-09-03T20:15:23.100 回答
0

我知道这是一个有点老的问题,但是在这种使用-pl选项的情况下帮助我的是使用相反的逻辑。与其传递您想要执行分析的模块,不如传递您不想分析的模块。例如,如果你有 4 个模块并且只想分析第三个模块,-pl你看起来像这样:

-pl !module1,!module2,!module4
于 2017-01-04T16:22:44.220 回答