2013-06-12 14 views
6

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.

risposta

5

Sonar Runner (con cui si integra Gradle) è solo in grado di analizzare il codice nei progetti foglia. Se desideri vedere il supporto per l'analisi del codice nei progetti non foglia, fai un ping ai ragazzi Sonar.

+0

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. –

Problemi correlati