У меня есть многомодульная кодовая база 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
, но это, похоже, не имеет никакого эффекта.