gpt4 book ai didi

gradle - 在使用 gradle 的多项目 java 代码库上使用 sonarRunner,会跳过一个项目的类

转载 作者:行者123 更新时间:2023-12-04 04:11:28 25 4
gpt4 key购买 nike

我有一个多模块 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 数据库。

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

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 .

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

我的项目结构是这样的(包括内部类在内的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 个类的 Sonar 报告,要么 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但这似乎没有任何效果。

最佳答案

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

关于gradle - 在使用 gradle 的多项目 java 代码库上使用 sonarRunner,会跳过一个项目的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17067905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com