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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...