Gradleのマルチプロジェクトサポートを使用して構築したマルチモジュールJavaコードベースがあります。使用しているgradleのバージョンは1.6です。このコードは、Oracle ATG アプリケーションを構築するために使用されます。モジュール/プロジェクトと外部 ATG モジュール間の依存関係を管理するために、カスタム リゾルバーと共に gradle Java プラグインを使用します。
ビルドは正常に動作し、問題なくコンパイルして 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 ダッシュボードがネストされたモジュールを正しく表示できるように、 sonar.projectName プロパティを設定します。sonar.projectName の値は次のようになりますParentModule.ChildModule.SubChildModule
。
Sonar レポートは、1 つを除いてほとんどのモジュールで機能します。このモジュールのすべてのクラスを単に無視しているようです。
私のプロジェクト構造は次のようになります (内部クラスを含む 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 ランナーはリーフ プロジェクトでのみ動作します。しかし、すべてのプロジェクトがリーフ プロジェクトになるように、Gradle ソナー ランナー プラグインを構成して階層をフラットなものとして扱う方法が必要です。sonar-runner では、おそらくルート プロジェクトの sonar.modules を、分析する各プロジェクトの名前に設定できます。しかし、Gradle でこれを行うにはどうすればよいでしょうか。
sonar.modules
各プロジェクトで設定しようとしましnull
たが、効果がないようです。