Использование sonarRunner в кодовой базе Java с несколькими проектами с использованием gradle пропускает классы ровно одного проекта

У меня есть многомодульная кодовая база Java, которую я создаю, используя поддержку нескольких проектов Gradle. Используемая версия Gradle — 1.6. Код используется для создания приложения Oracle ATG, и я использую плагин gradle java вместе с пользовательским преобразователем для управления зависимостями между модулями/проектами и внешними модулями ATG.

Сборка работает нормально, и я могу компилировать и создавать банки без проблем.

Я также использую плагин gradle eclipse и могу импортировать мультипроект gradle в eclipse, что приводит к тому, что все подпроекты импортируются в Eclipse с хорошо управляемым путем сборки java.

Я использую плагин sonar-runner, который поставляется с gradle, а версия Sonar — 3.4.1. Я использую базу данных H2, которая поставляется с Sonar.

Это то, что я использую для настройки 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.

Отчет 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, в котором есть файлы.

Так что я застрял либо с потерей отчетов Sonar по 343 классам, либо по 33 классам. Я бы тоже не стал выбирать.

Итак, наконец, мой вопрос: есть ли способ отключить запуск отчетов только для проекта с классами ZERO, а не для его родителей или детей?

К вашему сведению, если это имеет какое-либо значение, я устанавливаю только зависимости времени компиляции, используя такой синтаксис, как:

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

Зависимости разрешаются пользовательским распознавателем.

Пользовательский преобразователь поддерживается мной, но поскольку компиляция и плагин eclipse работают нормально, я предполагаю, что это не источник проблемы.

ИЗМЕНИТЬ

Как упоминал Питер Нидервизер, Sonar runner работает только с листовыми проектами. Но должен быть способ настроить подключаемый модуль Gradle sonar runner для обработки иерархии как плоской, чтобы все проекты были конечными проектами. В sonar-runner вы, вероятно, могли бы установить sonar.modules в корневом проекте имена каждого из проектов, которые вы хотите проанализировать. Но как это сделать в Gradle?

Я попытался установить sonar.modules в каждом проекте на null, но это, похоже, не имеет никакого эффекта.


person Rajesh J Advani    schedule 12.06.2013    source источник


Ответы (1)


Sonar Runner (с которым интегрируется Gradle) способен анализировать код только в конечных проектах. Если вы хотите увидеть поддержку анализа кода в неконечных проектах, отправьте эхо-запрос ребятам из Sonar.

person Peter Niederwieser    schedule 12.06.2013
comment
Спасибо, это имеет смысл. В таком случае, как мне запретить Sonar рассматривать их как дерево проектов, а не как список? Что-то делать со свойством sonar.modules? Голосую за это, так как это полезно, но это еще не решает мою проблему. - person Rajesh J Advani; 12.06.2013