2013-06-12 29 views
6

Tôi có một codebase java đa mô-đun, mà tôi xây dựng bằng cách sử dụng hỗ trợ đa dự án của gradle. Phiên bản gradle được sử dụng là 1.6. Mã này được sử dụng để xây dựng một ứng dụng Oracle ATG, và tôi sử dụng plugin java gradle cùng với một trình phân giải tùy chỉnh để quản lý các phụ thuộc giữa các mô-đun/dự án và các mô-đun ATG bên ngoài.Sử dụng sonarRunner trên một codebase java đa dự án bằng cách sử dụng gradle, bỏ qua các lớp chính xác một dự án

Công trình xây dựng hoạt động tốt và tôi có thể biên dịch và tạo các lọ không có vấn đề.

Tôi cũng sử dụng plugin eclipse gradle và có thể nhập đa dự án vào nhật thực, kết quả là tất cả các tiểu dự án được nhập vào Eclipse với đường dẫn xây dựng java được quản lý độc đáo.

Tôi đang sử dụng plugin sonar-runner được kết hợp với gradle và phiên bản của Sonar là 3.4.1. Tôi đang sử dụng cơ sở dữ liệu H2 đi cùng với Sonar.

Đây là những gì tôi sử dụng để cấu hình sonarRunner trong dự án gốc trong 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" 
    } 
} 

Đối với mỗi tiểu dự án, tôi làm điều này:

sonarRunner { 
    sonarProperties { 
     property "sonar.projectName", pathToAtgModuleName(path) 
     property "sonar.sourceEncoding", "UTF-8" 
     property "sonar.language", "java" 
    } 
} 

tôi thiết lập thuộc tính sonar.projectName để bảng điều khiển Sonar có thể hiển thị các mô-đun lồng nhau một cách chính xác. Giá trị của sonar.projectName trông giống như: ParentModule.ChildModule.SubChildModule.

Báo cáo Sonar hoạt động cho hầu hết các mô-đun, ngoại trừ một mô-đun. Có vẻ như đơn giản là bỏ qua tất cả các lớp học trong mô-đun này.

cấu trúc dự án của tôi là như thế này (số lượng lớp học java bao gồm các lớp bên trong là bên phải):

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 

Các module mà không hiển thị bất kỳ lớp học, là RootProj/MyMod.

Đối với một dự án mà các lớp học được phát hiện, đầu ra trông như thế này:

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 

Đây là sản phẩm SonarRunner cho rằng dự án:

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 

Như bạn có thể thấy, các mô-đun vi phạm doesn không hiển thị dòng nơi nó tìm thấy các thư mục nguồn.

Tôi bật các bản ghi gỡ lỗi gradle, và tôi thấy những giá trị này được in:

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 

Những dòng trên là không phải tất cả lại với nhau. Tôi vừa dán các giá trị mà tôi thấy thú vị.

Tôi đoán rằng vì RootProj.MyMod.versioned không có bất kỳ lớp học java nào, lỗi trong plugin hoặc trình giải mã siêu âm, khiến cho nó bỏ qua các lớp trong thư mục gốc đúng.

Vì vậy, tôi đã sử dụng skipProject = true cho RootProj.MyMod.versioned. Điều đó đã khắc phục được sự cố và tôi thấy các lớp đang được báo cáo cho RootProj.MyMod, nhưng Sonar không còn cố gắng chạy báo cáo cho RootProj.MyMod.versioned.catalog, mà không có tệp.

Vì vậy, tôi bị kẹt với việc mất báo cáo của Sonar trên 343 lớp hoặc 33 lớp. Tôi không muốn chọn một trong hai.

Vì vậy, cuối cùng, câu hỏi của tôi: Có cách nào để vô hiệu hóa việc chạy báo cáo trên chỉ dự án có lớp ZERO chứ không phải cha mẹ hoặc con cái của nó?

FYI, trong trường hợp nó có bất kỳ sự liên quan, tôi chỉ thiết lập thời gian biên dịch phụ thuộc sử dụng cú pháp như sau:

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

Các phụ thuộc được giải quyết bằng cách resolver tùy chỉnh.

Trình giải quyết tùy chỉnh được duy trì bởi tôi, nhưng do biên dịch và plugin eclipse hoạt động tốt, tôi giả định rằng đó không phải là nguồn gốc của sự cố.

EDIT

Như đã đề cập bởi Peter Niederwieser, Sonar Á hậu chỉ làm việc với các dự án lá. Nhưng phải có một cách để cấu hình các plugin Á hậu sonle Gradle để xử lý các hệ thống phân cấp như một căn hộ, để tất cả các dự án là các dự án lá. Trong sonar-runner, bạn có thể đặt sonar.modules tại dự án gốc thành tên của từng dự án bạn muốn phân tích. Nhưng làm thế nào để làm điều này trong Gradle?

Tôi đã thử đặt sonar.modules trong mỗi dự án thành null nhưng điều đó dường như không có bất kỳ ảnh hưởng nào.

Trả lời

5

Sonar Runner (mà Gradle được tích hợp với) chỉ có khả năng phân tích mã trong các dự án lá. Nếu bạn muốn xem hỗ trợ cho việc phân tích mã trong các dự án không phải lá, hãy ping những người Sonar.

+0

Cảm ơn, điều đó có ý nghĩa. Trong trường hợp đó, làm thế nào để ngăn chặn Sonar xử lý chúng như một cây dự án, và thay vào đó chỉ là một danh sách? Một cái gì đó để làm với các tài sản sonar.modules? Upvoting này vì nó rất hữu ích, nhưng nó vẫn chưa giải quyết được vấn đề của tôi. –

Các vấn đề liên quan