Ho una base di codice java multi-modulo, che costruisco utilizzando il supporto multi-progetto di gradle. La versione di gradle usata è 1.6. Il codice viene utilizzato per creare un'applicazione Oracle ATG e utilizzo il plugin java gradle insieme a un resolver personalizzato per gestire le dipendenze tra moduli/progetti e moduli ATG esterni.Uso di sonarRunner su un java codebase multi-progetto utilizzando gradle, ignora le classi di un solo progetto
La build funziona bene e posso compilare e creare giare senza problemi.
Uso anche il plugin gradle eclipse e posso importare il multiprogetto gradle in eclissi, il che si traduce in tutti i sottoprogetti importati in Eclipse con il java build-path gestito correttamente.
Sto utilizzando il plugin sonar-runner fornito con gradle e la versione di Sonar è 3.4.1. Sto usando il database H2 fornito con Sonar.
Questo è quello che uso per configurare sonarRunner nel progetto principale in 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"
}
}
Per ogni sottoprogetto, faccio questo:
sonarRunner {
sonarProperties {
property "sonar.projectName", pathToAtgModuleName(path)
property "sonar.sourceEncoding", "UTF-8"
property "sonar.language", "java"
}
}
ho impostare la proprietà sonar.projectName in modo che la dashboard di Sonar può mostrare correttamente i moduli nidificati. Il valore di sonar.projectName è simile a: ParentModule.ChildModule.SubChildModule
.
Il rapporto Sonar funziona per la maggior parte dei moduli, tranne uno. Semplicemente sembra ignorare tutte le classi in questo modulo.
La mia struttura del progetto è come questo (il numero di classi Java, tra cui le classi interne è a destra):
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
Il modulo che non riesce a mostrare tutte le classi, è RootProj/MyMod.
Per un progetto in cui vengono rilevate le classi, l'uscita si presenta così:
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
Questa è l'uscita SonarRunner per quel progetto:
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
Come si può vedere, il modulo incriminato doesn 'mostrare la linea in cui trova le directory di origine.
ho acceso registri di debug Gradle, e ho visto questi valori in fase di stampa:
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
Le linee di cui sopra non erano tutti insieme. Ho appena incollato i valori che ho trovato interessanti.
Suppongo che dal momento che RootProj.MyMod.versioned
non ha classi java, un bug nel plugin gradle o nel sonar-runner stesso, fa sì che salti le classi nella directory padre true.
Quindi ho usato skipProject = true per RootProj.MyMod.versioned
. Questo ha risolto il problema e vedo che le classi sono state segnalate per RootProj.MyMod, ma Sonar non tenta più di eseguire un report per RootProj.MyMod.versioned.catalog, che contiene file.
Quindi sono bloccato con perdere i rapporti Sonar su 343 classi o 33 classi. Preferirei non scegliere neanche.
Quindi, infine, la mia domanda: C'è un modo per disabilitare l'esecuzione dei report solo sul progetto con classi ZERO, e non i suoi genitori o figli?
FYI, nel caso in cui esso ha alcuna rilevanza, ho solo messa a punto compilazione dipendenze temporali utilizzando la sintassi simile:
compile group:'ATG_MODULE', name:'mymodule', version:'10.1.1'
Le dipendenze sono risolte dal resolver personalizzato.
Il resolver personalizzato viene gestito da me, ma poiché la compilazione e il plugin Eclipse funzionano correttamente, suppongo che non sia la fonte del problema.
EDIT
Come accennato da Peter Niederwieser, Sonar corridore funziona solo con progetti foglia. Ma deve esserci un modo per configurare il plugin runle sonar di Gradle per trattare la gerarchia come una piatta, in modo che tutti i progetti siano progetti foglia. In sonar-runner potresti probabilmente impostare sonar.modules nel progetto root con i nomi di ciascuno dei progetti che vuoi analizzare. Ma come si fa a Gradle?
Ho provato a impostare sonar.modules
in ogni progetto su null
ma ciò non sembra avere alcun effetto.
Grazie, ha senso. In tal caso, come impedire a Sonar di trattarli come un albero di progetti, e invece solo un elenco? Qualcosa che ha a che fare con la proprietà sonar.modules? L'upvoting è utile, ma non risolve ancora il mio problema. –