鍍金池/ 教程/ 物聯(lián)網(wǎng)/ Sonar 插件
問題反饋
Gradle 插件
Scala 插件
Gradle 命令行的基本使用
任務(wù)詳述
安裝
概述
教程-雜七雜八
構(gòu)建環(huán)境
依賴管理基礎(chǔ)
使用 Gradle 圖形用戶界面
使用文件
CodeNarc 插件
Sonar 插件
Groovy 插件
Sonar Runner 插件
OSGi 插件
Ear 插件
Gradle 守護(hù)進(jìn)程
Java 插件
簡(jiǎn)介
構(gòu)建基礎(chǔ)
FindBugs 插件
Groovy 快速入門
JaCoCo 插件
PMD 插件
War 插件
Checkstyle 插件
日志
Java 構(gòu)建入門
Jetty 插件
從 Gradle 中調(diào)用 Ant
標(biāo)準(zhǔn)的 Gradle 插件
Web 工程構(gòu)建
JDepend 插件
編寫構(gòu)建腳本

Sonar 插件

你可能會(huì)想使用新的 Sonar Runner 插件來(lái)代替現(xiàn)在這個(gè)插件。尤其是因?yàn)橹挥?Sonar Runner 插件支持 Sonar 3.4 及更高的版本。

Sonar 插件提供了對(duì) Sonar,一個(gè)基于 web 的代碼質(zhì)量監(jiān)測(cè)平臺(tái)的集成。該插件添加了sonarAnalyze task ,用來(lái)分析一個(gè) project 及子 project 都應(yīng)用了哪個(gè)插件。分析結(jié)果存儲(chǔ)于 Sonar 數(shù)據(jù)庫(kù)中。該插件基于 Sonar Runner,并要求是 Sonar 2.11 或更高的版本。

SonarAnalyze task 是一項(xiàng)需要顯式執(zhí)行的獨(dú)立任務(wù),不依賴于任何其他 task。除了源代碼之外,該 task 還分析了類文件和測(cè)試結(jié)果文件(如果有)。為獲得最佳結(jié)果,建議在分析前運(yùn)行一次完整的構(gòu)建。在典型的設(shè)置中,會(huì)每天在構(gòu)建服務(wù)器上運(yùn)行一次分析。

用法

最低要求是必須配置 Sonar 插件應(yīng)用于該 project。

配置使用 Sonar 插件

build.gradle

apply plugin: "sonar"  

除非 Sonar 是在本地上運(yùn)行,并且有默認(rèn)的配置,否則有必要配置 Sonar 服務(wù)器及數(shù)據(jù)庫(kù)的連接設(shè)置。

配置 Sonar 連接設(shè)置

build.gradle

sonar
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}  

或者,可以從命令行設(shè)置某些或全部的連接設(shè)置。

Project 設(shè)置會(huì)決定這個(gè)項(xiàng)目將如何進(jìn)行分析。默認(rèn)配置非常適合于分析標(biāo)準(zhǔn) Java 項(xiàng)目,并可以在許多方面進(jìn)行自定義。

配置 Sonar project 設(shè)置

build.gradle

sonar
    project
        coberturaReportPath = file("$buildDir/cobertura.xml")
    }
}  

在上面的例子中,sonar,server,database 和 project 塊分別配置的是SonarRootModel, SonarServer, SonarDatabase 及 SonarProject 類型的對(duì)象??梢圆殚喫鼈兊?API 文檔以了解更多信息。

分析多項(xiàng)目構(gòu)建

Sonar 插件能夠一次分析整個(gè)項(xiàng)目的層次結(jié)構(gòu)。它能夠在 Sonar 的 web 界面生成一個(gè)層次圖,該層次圖包含了綜合的指標(biāo)且能夠深入到子項(xiàng)目中。同時(shí),它比單獨(dú)分析每個(gè)項(xiàng)目更快。

要分析項(xiàng)目的層次結(jié)構(gòu), 需要把 Sonar 插件應(yīng)用于層次結(jié)構(gòu)的最頂層項(xiàng)目。通常(但不是一定)會(huì)是根項(xiàng)目。在該 project 中的 sonar 塊配置的是一個(gè) SonarRootModel 類型的對(duì)象。它擁有所有全局配置,最重要的服務(wù)器和數(shù)據(jù)庫(kù)的連接設(shè)置。

在多項(xiàng)目構(gòu)建中的全局配置

build.gradle

apply plugin: "sonar"
sonar {
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}   

層次結(jié)構(gòu)中的每個(gè)項(xiàng)目都有其自身的項(xiàng)目配置。共同的值可以在父構(gòu)建腳本中進(jìn)行設(shè)置。

多項(xiàng)目構(gòu)建中的共同項(xiàng)目配置

build.gradle

subprojects {
    sonar
        project
            sourceEncoding = "UTF-8"
        }
    }
}  

在子項(xiàng)目中的 sonar 塊配置的是一個(gè) SonarProjectModel 類型的對(duì)象。

這些 Projects 也可以單獨(dú)配置。例如,設(shè)置 skip 屬性為 true 以防止一個(gè)項(xiàng)目(和它的子項(xiàng)目)被分析。跳過的項(xiàng)目將不會(huì)顯示在 Sonar 的 web 界面中。

多項(xiàng)目構(gòu)建中的單獨(dú)項(xiàng)目配置

build.gradle

project
    sonar
        project
            skip = true
        }
    }
}  

另一種典型的各個(gè)項(xiàng)目配置是配置要分析的編程語(yǔ)言。注意,Sonar 只能分析每個(gè)項(xiàng)目的一種語(yǔ)言。

配置語(yǔ)言分析

build.gradle

project
    sonar
        project
            language = "groovy"
        }
    }
}  

當(dāng)一次只設(shè)置一個(gè)屬性時(shí),等效屬性的語(yǔ)法更加簡(jiǎn)潔:

使用屬性語(yǔ)法

build.gradle

project(":project2").sonar.project.language = "groovy"  

分析自定義的 Source Sets

默認(rèn)情況下,Sonar 插件將分析 main source set 里的生產(chǎn)源文件,以及 test source sets 里的測(cè)試源文件。它的分析獨(dú)立于項(xiàng)目的源目錄布局。根據(jù)需要,可以添加額外的 source sets。

分析自定義的 Source Sets

build.gradle

sonar.project {
    sourceDirs += sourceSets.custom.allSource.srcDirs
    testDirs += sourceSets.integTest.allSource.srcDirs
}  

分析非 Java 語(yǔ)言

要分析非 Java 語(yǔ)言編寫的代碼,請(qǐng)安裝相應(yīng)的 Sonar 插件,并相應(yīng)地設(shè)置 sonar.project.language :

分析非 Java 語(yǔ)言

build.gradle

sonar.project {
    language = "grvy" // set language to Groovy
}  

截至 Sonar 3.4,每個(gè)項(xiàng)目只可以分析一種語(yǔ)言。不過,在多項(xiàng)目構(gòu)建中你可以為不同的項(xiàng)目設(shè)置不同的語(yǔ)言。

設(shè)置自定義的 Sonar 屬性

最終,大多數(shù)配置都會(huì)以被稱為 Sonar 屬性的鍵-值對(duì)的形式傳遞給 Sonar 的代碼分析器。在 API 文檔中的 SonarProperty 注解顯示了插件的對(duì)象模型的屬性是如何映射到相應(yīng)的 Sonar 屬性中的。Sonar 插件提供了 hooks,用于 Sonar 屬性傳給代碼分析器前的后置處理。相同的 hook 可以用來(lái)添加額外的屬性,并且不會(huì)被插件的對(duì)象模型所覆蓋。

對(duì)于全局的 Sonar 屬性,可以使用 SonarRootModel 上的 withGlobalProperties hook:

設(shè)置自定義的全局屬性

build.gradle

sonar.withGlobalProperties { props ->
    props["some.global.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.global.property"] = ["foo", "bar", "baz"]
}  

對(duì)于每個(gè)項(xiàng)目的 Sonar 屬性,使用 SonarProject 上的 withProjectProperties hook:

設(shè)置自定義的項(xiàng)目屬性

build.gradle

sonar.project.withProjectProperties { props ->
    props["some.project.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.global.property"] = ["foo", "bar", "baz"]
}  

Sonar 的可用屬性的列表可以在 Sonar 文檔中找到。注意,對(duì)于大多數(shù)的這些屬性,Sonar 插件的對(duì)象模型具有等效的屬性,且沒有必要使用 withGlobalProperties 或withProjectProperties 的 hook。對(duì)于第三方 Sonar 插件的配置,請(qǐng)參閱插件的文檔。

從命令行配置 Sonar 的設(shè)置

下面的屬性或者可以從命令行中或者是作為 sonarAnalyze 任務(wù)的任務(wù)參數(shù)這兩種方式之一來(lái)設(shè)置。任務(wù)參數(shù)將覆蓋任何在構(gòu)建腳本中設(shè)置的相應(yīng)值。

  • server.url
  • database.url
  • database.driverClassName
  • database.username
  • database.password
  • showSql
  • showSqlResults
  • verbose
  • forceAnalysis

下面是一個(gè)完整的例子:

gradle sonarAnalyze --server.url=http://sonar.mycompany.com --database.password=myPassword --verbose  

如果你需要從命令行設(shè)置其他屬性,你可以使用系統(tǒng)屬性來(lái)做:

實(shí)現(xiàn)自定義命令行屬性

build.gradle

sonar.project {
    language = System.getProperty("sonar.language", "java")
}  

然而,請(qǐng)記住,通常最好是配置在構(gòu)建腳本中,并在代碼控制下。

任務(wù)

Sonar 插件向 project 中添加了以下任務(wù)。

表 35.1. 聲納插件 - 任務(wù)

任務(wù)名稱 依賴于 類型 描述
sonarAnalyze - sonarAnalyze 分析項(xiàng)目層次結(jié)構(gòu),并將結(jié)果存儲(chǔ)在 Sonar 數(shù)據(jù)庫(kù)。