Gradle Java 插件

来源:https://www.cnblogs.com/skymxc/archive/2019/09/21/gradle-java-plugin.html
-Advertisement-
Play Games

Java 插件是構建 JVM 項目的基礎,它為項目增加了很多能力,例如編譯,測試,打包,發佈等等。 很多插件都是基於 Java 插件實現的,例如 Android 插件。 ...


思維導圖

Java 插件是構建 JVM 項目的基礎,它為項目增加了很多能力,例如編譯,測試,打包,發佈等等。

很多插件都是基於 Java 插件實現的,例如 Android 插件。

用法

使用 id 應用插件

plugins {
    id 'java'
}

Source sets 源集

Java 插件引入了源集的概念,它在邏輯上表示一組用於編譯執行的源文件,這些源文件可能包括源代碼文件和資源文件。

一個源集有一個相關聯的編譯類路徑和運行時類路徑。

Java 插件就是通過源集的概念來管理源代碼目錄的。

源集的一個用途是,把源文件進行邏輯上的分組,以描述它們的目的。
例如,你可能會使用一個源集來定義一個集成測試套件,或者你可能會使用單獨的源集來定義你的項目的 API 和實現類。

Java 插件提供了兩個標準源集

  • main 包含了項目的源代碼,被用於編譯和生成 JAR 文件
  • test 包含單元測試源代碼,它們將被編譯並使用 JUnit 或 TestNG 來執行。

源集提供了很多屬性,我這裡就列出幾個重要的屬性:

屬性 類型 預設值 描述
name - 只讀 String 非空 源集的名字
output - 只讀 SourceSetOutput 非空 源集的輸出文件,包括它編譯過的類和資源。
output.classesDirs 只讀 FileCollection $buildDir/classes/java/$name

例如:build/classes/java/main
源集編譯過的 class 文件目錄
output.resourcesDir 只讀 File $buildDir/resources/$name例如main源集:build/resources/main 源集產生的資源目錄
java - 只讀 SourceDirectorySet [${project.projectDir}/src/${sourceSet.name}/java] 源集的 Java 源代碼 ,只包含 .java 會排除其他類型。
java.srcDirs Set src/$name/java,

例如 src/main/java
源集的 Java 源文件的源目錄。是一個集合,可以設置多個源代碼目錄,更改源代碼目錄就是更改這個屬性
java.outputDir File $buildDir/classes/java/$name,

e.g. build/classes/java/main
源代碼編譯的 class 文件輸出目錄
resources - 只讀 SourceDirectorySet [${project.projectDir}/src/${sourceSet.name}/resources] 源集的資源,只包含資源。
resources.srcDirs Set [src/$name/resources] 源集的資源目錄,是一個集合,可以指定多個

跟多的源集屬性可以查看下麵的文檔

sourceSets DSL

sourceSets API

定義一個新的源集

源集的位置也很重要,不要在 dependencies 下麵,否則對源集的依賴就將不起作用

sourceSets {
    other
}

訪問源集

sourceSets 是 Java 插件為 Project 增加的一個屬性,可以直接使用。

task outSourceSet {
    doLast {
        //遍歷
        sourceSets.all {
            println "$name -> "
        }
        println "-----分割線----"
        //單個的
        println "${sourceSets.main.name} -> "
        println "${sourceSets['main'].name} -> "

        //一些屬性
        println " java.srcDirs -->${sourceSets.main.java.srcDirs}"
        println " resource.srcDirs -->${sourceSets.main.resources.srcDirs}"
    }
}

為源集添加依賴

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:27.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
    //為 other 源集添加依賴
    otherImplementation 'com.google.code.gson:gson:2.8.5'
}

將源集打成一個 JAR 包

創建一個 otherJar 任務,將源集的輸出作為任務的文件來源。

執行這個任務即可生成 JAR 包。

/**
 * 為 other 源集打個 jar 包
 * 預設輸出目錄是 build/libs
 * 預設名字是 [archiveBaseName]-[archiveAppendix]-[archiveVersion]-[archiveClassifier].[archiveExtension]
 */
task otherJar(type:Jar){
    archiveBaseName = sourceSets.other.name
    archiveVersion = '0.1.0'
    destinationDirectory = file("${project.projectDir}/jar")
    from sourceSets.other.output
}

為源集生成 doc

創建一個任務將源集的所有 Java 文件作為源文件。

執行這個任務即可生成 doc 文件。

task otherDoc(type:Javadoc){
    destinationDir = file("${project.projectDir}/doc")
    source sourceSets.other.allJava
    title sourceSets.other.name
}

項目結構

Java 插件的預設目錄結構如下所示, 無論這些文件夾中有沒有內容, Java 插件都會編譯裡面的內容, 並處理沒有的內容。

這個目錄結構也是 Java 世界標準的項目目錄。

目錄 描述
src/main/java Java 源文件目錄
src/main/resources 資源文件目錄,例如 xml 和 properties 文件
src/test/java Java 測試源文件目錄
src/test/resources 測試資源目錄
src/sourceSet/java 給定源集的源代碼目錄
src/sourceSet/resources 給定源集的資源目錄

更改預設目錄

這裡以更改 main 源集的源代碼和資源目錄為例

sourceSets {
    main {
        java {
            srcDirs = ['src/java']
        }
        resources {
            srcDirs = ['src/resources']
        }
    }
}

增加的任務

Java 插件為 Project 增加了很多實用的任務,如下:

  • compileJava 類型是 JavaCompile

    依賴於:所有參與編譯類路徑的任務,包括 jar 任務和通過項目依賴性在類路徑上的項目中的任務。

    功能:使用 JDK 編譯器編譯生產 Java 源文件。
  • processResources Copy

    功能:複製生產資源到資源目錄
  • classes

    依賴:compileJava , processResources

    這是個整合的任務,只是依賴於其他任務。其他插件可能會附加別的編譯任務到這裡。
  • compileTestJava JavaCompile

    依賴:classes, 以及有助於測試編譯類路徑的所有任務

    功能:使用 JDK 編譯器編譯測試 Java 源代碼和資源文件
  • processTestResources Copy

    功能:複製測試資源到測試資源目錄
  • testClasses

    依賴:compileTestJava , processTestResources

    這是個整合任務,只是依賴其他任務。其他擴展插件可能會將測試編譯任務附加到這裡。

  • jar Jar

    依賴:classes

    功能:根據主源集的類和資源,組裝生產 JAR 文件。
  • javadoc JavaDoc

    依賴:classes

    功能:生成 API 文檔。

  • test Test

    依賴:testClasses 以及生成測試運行時類路徑的所有任務

    功能:使用 JUnit 或者 TestNG 運行單元測試

  • uploadArchives Upload

    依賴:jar 以及生辰附加在 archives{} 配置里的構件的任何其他任務。

    功能:上傳 archives{} 配置里的構件包含生成的 JAR 文件到配置的倉庫。

  • clean Delete

    功能:刪除項目構建目錄

  • clean[TaskName] Delete

    功能:刪除由指定任務生成的文件。例如 cleanJar 將刪除由 jar 任務產生的文件。

源集任務

你增加的每一個源集,Java 插件都會為它增加下麵列出的任務:

  • compilesourceSetJava JavaCompile

    依賴:所有有助於源集編譯類路徑的任務。

    功能:使用 JDK 編譯器編譯給定源集的 Java 源文件

  • processsourceSetResources Copy

    功能:複製給定源集的資源到資源目錄

  • sourceSetClasses Task

    依賴:compilesourceSetJava , processsourceSetResources

    功能:準備給定的源集的類和資源以進行打包和執行。一些擴展插件可能會為給定源集附加編譯任務到這裡

生命周期任務

Java 插件將它的一些任務附加到基礎插件(Java插件自動應用)定義的生命周期任務上。

它還添加了一些其他的生命周期任務:

  • assemble

    依賴:jar, 以及創建附加到歸檔配置的工件的所有其他任務。

    彙總項目中所有歸檔的聚合任務。 這個任務是基礎插件(Base)里定義的。

  • check

    依賴:test

    彙總項目中的驗證任務,例如運行測試。一些插件會增加自己的驗證任務到這裡。這個任務是基礎插件(Base) 里定義的。

  • build

    依賴:check, assemble

    聚合執行項目完整構建的任務。這個任務是基礎插件(Base) 里定義的。

  • buildNeeded

    依賴:build ,以及在testRuntimeClasspath配置中依賴的所有項目中的buildNeeded任務。

    執行項目本身及其依賴的所有項目的完整構建。

  • buildDependents

    依賴:build, 以及在 testRuntimeClasspath 配置中依賴此項目的所有項目的 buildDependents 任務

    執行項目本身以及依賴於它的所有項目的完整構建。

  • buildConfigName -任務規則

    依賴:生成附加到命名- ConfigName -配置的工件的所有任務

    為指定的配置組裝工件。這個規則是在基礎插件增加的。

  • uploadConfigName -任務規則,類型:Upload

    依賴:生成附加到命名- ConfigName -配置的工件的所有任務

    在指定的配置里組裝和上傳構件。這個規則是在基礎插件增加的。

下麵的圖展示了這些任務的關係

Java插件任務圖

依賴管理

Java 插件增加了很多依賴配置到項目中,JavaCompile 和 test 任務就可以使用這些配置將依賴文件添加到類路徑並使用他們。

依賴配置 描述
compile 編譯時依賴,被 implementation 取代
implementation 繼承自compile 僅實現依賴性。
compileOnly 僅僅編譯時依賴 運行時不能用
compileClasspath 繼承自 compile,compileOnly,implemenation 當編譯源代碼時使用的編譯類路徑,被 compileJava 任務使用
annotationProcessor 編譯時使用的註解處理器
runtime 繼承自 compile 運行時依賴,由 runtimeOnly 取代
runtimeOnly 僅運行時依賴,編譯時不能用
runtimeClasspath 繼承自 runtimeOnly,runtime,implementation 運行時類路徑包含 implementation 和僅運行時的元素
testCompile 繼承自 compile 測試編譯的依賴項,被 testImplementation 取代
testImplementation 繼承自 testCompile,implemenation 僅實現測試依賴
testCompileOnly 編譯時測試依賴,僅僅只在編譯時
testCompileClasspath 繼承自 testCompile ,testCompileOnly ,testImplementation 測試編譯類路徑,當編譯測試代碼的時由 compileTestJava 任務使用
testRuntime 繼承自 runtime,testCompile 測試運行時依賴,由 testRuntimeOnly 取代
testRuntimeOnly 繼承自 runtimeOnly 測試的運行時依賴
testRuntimeClasspath 繼承自 testRuntimeOnly,testRuntime,testImplementation 運行測試的運行時類路徑,由 test 任務使用
archives 項目產生的構件(例如 jar),由 uploadArchives 使用

下麵兩張圖是 main 和 test 源集的配置依賴關係

  • 灰色字體:已廢棄的
  • 黑色字體綠色背景:可以根據配置聲明依賴項。
  • 灰藍背景: 該配置用於被任務使用,而不是用於聲明依賴項。
  • 淺藍色背景:任務

main

test

除了以上的配置,Java 插件為了每個源集還添加了以下配置,這些配置只針對給定源集

依賴配置 描述
sourceSetCompile 已廢棄 給定源集的編譯時依賴,由 sourceSet Implementation 取代
sourceSet Implementation extend sourceSetCompile 實現給定源集的依賴性。由 sourceSetCompileClasspath, sourceSetRuntimeClasspath 使用。
sourceSetCompileOnly 給定源集的編譯時依賴,只能在編譯時使用。
sourceSetCompileClasspath extend compilesourceSetJava 當編譯源代碼時的編譯類路徑,被 sourceSetCompile,sourceSetCompileOnly,sourceSetImplementation 使用。
sourceSetAnnotationProcessor 給定源集在編譯時使用的註解處理器
sourceSetRuntime 已廢棄 給定源集的運行時依賴,由 sourceSetRuntimeOnly 取代
sourceSetRuntimeOnly 給定源集的運行時依賴,僅僅是運行時的
sourceSetRuntimeClasspath extends sourceSetRuntimeOnly ,sourceSetRuntime,sourceSetImplementation 給定源集的運行時類路徑,包含 implement 和 runtime 的元素。

增加的屬性

Java 插件為項目增加了很多新的屬性,可以在腳本中直接使用這些屬性。

下麵是一些我認為比較重要的屬性:

屬性 類型 預設值 描述
sourceSets 只讀 SourceSetContainer 非空 包含項目的源集
sourceCompatibility JavaVersion 當前 JVM 的版本 編譯 Java 源代碼時使用的 Java 版本,可以是一個 數值或者字元串,例如 '1.8' 或者 1.8
targetCompatibility JavaVersion sourceCompatibility 生成 class 文件的版本,可以是一個 數值或者字元串,例如 '1.8' 或者 1.8
archivesBaseName String 歸檔的文件使用的名字,例如 JAR 和 ZIP 文件
manifest Manifest 一個空的清單 包含所有 JAR 文件的清單。
libsDirName String libs 項目生成的庫的存放目錄,項目的相對路徑。

更多的屬性可以查看文檔 Convention properties

學習資料:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在SQL Server資料庫中,有時候會建立一些Windows認證的賬號(域賬號),例如,我們公司習慣給開發人員和Support同事開通NT賬號許可權,如果有離職或負責事宜變更的話,那麼要如何正確的刪除這些Windows認證賬號呢?這篇文章就是來探討一下如何正確的刪除Windows認證賬號。如下所示:... ...
  • 1.redis學習 數據預設寫入到記憶體,如果斷電,伺服器宕機,redis進程掛掉,數據會丟失。 selenium操作瀏覽器時,要註意瀏覽器資源釋放,方式記憶體泄露,崩潰 mysql是文件型資料庫,預設持久化到硬碟上 redis 是記憶體型資料庫 2.redis安裝學習 yum安裝,最簡單,配置yum源, ...
  • 2. 資料庫操作 資料庫在創建以後最常見的操作便是 2.1 查詢 為了便於學習和理解,我們預先準備了兩個表分別是 表和 表兩個表的內容和結構如下所示 表的內容: | id | class\_id | name | gender | score | | | | | | | | 1 | 1 | 小明 | ...
  • 背景 Mysql是一個關係型資料庫,由瑞典Mysql AB開發,目前屬於Oracle旗下的產品。Mysql是目前最流行的關係型資料庫管理系統之一,在WEB方面,Mysql是最好的RDBMS(Relational Database Management System)。Mysql是一種關係資料庫管理系 ...
  • 大數據 概述 大數據是新處理模式才能具備更多的決策力,洞察力,流程優化能力,來適應海量高增長率,多樣化的數據資產。 大數據面臨的問題 怎麼存儲海量數據(kb,mb,gb,tb,pb,eb,zb) 怎麼對數據進行降噪處理(對數據進行清洗,使得數據變廢為寶,提取有用的數據,減少不必要的數據資源空間的釋放 ...
  • 規範總結 所有資料庫對象名稱必須使用小寫字母並用下劃線分割 所有資料庫對象名稱禁止使用 MySQL 保留關鍵字【設計表後逐一排查】 所有表必須使用 Innodb 存儲引擎,資料庫和表的字元集統一使用 UTF8 所有表和欄位都需要添加註釋 禁止在資料庫中存儲圖片,文件等大的二進位數據 【 通常存儲於文 ...
  • MySQL是Oracle公司開發、發佈和支持的最流行的開源SQL資料庫管理系統。 ...
  • 一 題目 二 答案 1、查詢所有的課程的名稱以及對應的任課老師姓名 SELECT course.cname, teacher.tname FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid; 2、查詢學生表中男女生各有多 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...