主頁 > 移動端開發 > Gradle Java 插件

Gradle Java 插件

2020-09-16 17:20:19 移動端開發

思維導圖

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

學習資料:

  • https://wiki.jikexueyuan.com/project/gradle/java-package.html
  • http://benweizhu.github.io/blog/2015/01/31/deep-into-gradle-in-action-2/
  • https://docs.gradle.org/current/userguide/java_plugin.html
  • https://docs.gradle.org/current/userguide/building_java_projects.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/58603.html

標籤:Android

上一篇:自定義View入門-繪制基礎(1)

下一篇:Could not find any version that matches com.android.support:appcompat-v7:29.+

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more