6

我有一个多模块 java 代码库,我使用 gradle 的多项目支持构建。使用的 gradle 版本是 1.6。该代码用于构建 Oracle ATG 应用程序,我使用 gradle java 插件和自定义解析器来管理模块/项目与外部 ATG 模块之间的依赖关系。

构建工作正常,我可以毫无问题地编译和创建 jar。

我还使用了 gradle eclipse 插件,并且可以将 gradle 多项目导入到 eclipse 中,这导致所有子项目都被导入到 Eclipse 中,java 构建路径管理得很好。

我用的是gradle自带的sonar-runner插件,Sonar的版本是3.4.1。我正在使用 Sonar 附带的 H2 数据库。

这是我用来在根项目中配置 sonarRunner 的build.gradle

apply plugin: "sonar-runner"

sonarRunner {
    sonarProperties {
      property "sonar.host.url", "http://localhost:9000"
      property "sonar.jdbc.url", "jdbc:h2:tcp://localhost:9092/sonar"
      property "sonar.jdbc.driverClassName", "org.h2.Driver"
      property "sonar.jdbc.username", "sonar"
      property "sonar.jdbc.password", "sonar"
    }
}

对于每个子项目,我这样做:

sonarRunner {
    sonarProperties {
        property "sonar.projectName", pathToAtgModuleName(path)
        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.language", "java"
    }
}

我设置了 sonar.projectName 属性,以便 Sonar 仪表板可以正确显示嵌套模块。sonar.projectName 的值如下所示:ParentModule.ChildModule.SubChildModule

声纳报告适用于大多数模块,除了一个。它似乎只是忽略了这个模块中的所有类。

我的项目结构是这样的(包括内部类在内的java类的数量在右边):

RootProj/core 356
RootProj/MyMod 343
RootProj/MyMod/versioned 0
RootProj/MyMod/versioned/catalog 33
RootProj/integration/int1 9
RootProj/integration/int2 7
RootProj/integration/int3 5
RootProj/integration/int4 2
RootProj/integration/int5 17
RootProj/integration/int6 44
RootProj/perf 0
RootProj/REST 12
RootProj/Store 11
RootProj/TestRest 92
RootProj/TestStore 141
RootProj/TestVersioned 1
RootProj/webservices 14

未能显示任何类的模块是RootProj/MyMod

对于检测到类的项目,输出如下所示:

18:58:34.016 INFO  .s.b.b.ProjectModule - -------------  Analyzing RootProj.MyMod.versioned.catalog
18:58:34.019 INFO  .b.b.ProjectSettings - Load module settings
18:58:34.859 INFO  .s.b.ProfileProvider - Quality profile : [name=RCS_way,language=java]
18:58:34.883 INFO  nPluginsConfigurator - Configure maven plugins...
18:58:34.977 INFO        org.sonar.INFO - Compare to previous analysis (2013-06-12)
18:58:35.026 INFO        org.sonar.INFO - Compare over 5 days (2013-06-07, analysis of 2013-06-05 12:16:12.963)
18:58:35.066 INFO        org.sonar.INFO - Compare over 30 days (2013-05-13, analysis of 2013-06-03 15:12:37.359)
18:58:35.133 INFO  .b.p.SensorsExecutor - Initializer ProjectFileSystemLogger...
18:58:35.135 INFO  jectFileSystemLogger - Excluded tests: [**/package-info.java]
18:58:35.139 INFO  jectFileSystemLogger - Source directories:
18:58:35.140 INFO  jectFileSystemLogger -   D:\eCommerce\code\R0_3\RootProj\MyMod\versioned\catalog\src
18:58:35.140 INFO  .b.p.SensorsExecutor - Initializer ProjectFileSystemLogger done: 7 ms
18:58:35.185 INFO  p.PhasesTimeProfiler - Sensor JavaSourceImporter...
18:58:35.441 INFO  p.PhasesTimeProfiler - Sensor JavaSourceImporter done: 256 ms

这是该项目的输出 SonarRunner:

18:59:24.747 INFO  .s.b.b.ProjectModule - -------------  Analyzing RootProj.MyMod
18:59:24.748 INFO  .b.b.ProjectSettings - Load module settings
18:59:25.164 INFO  .s.b.ProfileProvider - Quality profile : [name=RCS_way,language=java]
18:59:25.175 INFO  nPluginsConfigurator - Configure maven plugins...
18:59:25.186 INFO        org.sonar.INFO - Compare to previous analysis (2013-06-12)
18:59:25.194 INFO        org.sonar.INFO - Compare over 5 days (2013-06-07, analysis of 2013-06-05 12:16:12.957)
18:59:25.203 INFO        org.sonar.INFO - Compare over 30 days (2013-05-13, analysis of 2013-06-03 15:12:37.355)
18:59:25.211 INFO  .b.p.SensorsExecutor - Initializer ProjectFileSystemLogger...
18:59:25.212 INFO  jectFileSystemLogger - Excluded tests: [**/package-info.java]
18:59:25.212 INFO  .b.p.SensorsExecutor - Initializer ProjectFileSystemLogger done: 1 ms
18:59:25.213 INFO  p.PhasesTimeProfiler - Sensor JavaSourceImporter...
18:59:25.224 INFO  p.PhasesTimeProfiler - Sensor JavaSourceImporter done: 11 ms

如您所见,有问题的模块没有显示找到源目录的行。

我打开了 gradle 调试日志,我看到这些值被打印出来:

RootProj.MyMod.sonar.modules: versioned
RootProj.MyMod.sonar.sources: D:\eCommerce\code\R0_3\RootProj\MyMod\src
RootProj.MyMod.versioned.catalog.sonar.sources: D:\eCommerce\code\R0_3\RootProj\MyMod\versioned\catalog\src
RootProj.MyMod.versioned.sonar.modules: catalog
RootProj.MyMod.versioned.sonar.sources: D:\eCommerce\code\R0_3\RootProj\MyMod\versioned\src

以上几行并非全部在一起。我刚刚粘贴了我发现有趣的值。

我的猜测是,由于RootProj.MyMod.versioned没有任何 java 类,因此 gradle 插件或 sonar-runner 本身中的错误会导致它跳过父目录中的类 true。

所以我使用了 skipProject = true RootProj.MyMod.versioned。这解决了问题,我看到为 RootProj.MyMod 报告的类,但 Sonar 不再尝试为确实有文件的 RootProj.MyMod.versioned.catalog 运行报告。

所以我要么丢失 343 个类的声纳报告,要么 33 个类。我两个都不选。

最后,我的问题是:有没有办法禁用仅在具有零类的项目上运行报告,而不是在其父级或子级上运行报告?

仅供参考,如果它有任何相关性,我只使用如下语法设置编译时依赖项:

compile group:'ATG_MODULE', name:'mymodule', version:'10.1.1'

依赖项由自定义解析器解析。

自定义解析器由我维护,但由于编译和 eclipse 插件工作正常,我假设它不是问题的根源。

编辑

正如 Peter Niederwieser 所提到的,Sonar runner 仅适用于叶子项目。但是必须有一种方法来配置 Gradle sonar runner 插件,将层次结构视为一个平面,以便所有项目都是叶子项目。在 sonar-runner 中,您可能会将根项目中的 sonar.modules 设置为您要分析的每个项目的名称。但是如何在 Gradle 中做到这一点?

我尝试sonar.modules在每个项目中设置为,null但这似乎没有任何效果。

4

1 回答 1

5

Sonar Runner(与 Gradle 集成)只能分析叶子项目中的代码。如果您希望看到对在非叶子项目中分析代码的支持,请联系 Sonar 人员。

于 2013-06-12T15:25:17.490 回答