您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java用Gradle配置compile及implementation和api的區(qū)別是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
這個(gè)主要看Java項(xiàng)目所使用的Gradle的版本。
Gradle 3.4 新增了Java-library插件,java-library插件使用了新的依賴配置implementation和api。舊的依賴配置compile被廢棄。
Gradle 3.4 之前的版本
java插件:
apply plugin: 'java'
添加依賴:
dependencies { compile 'commons-httpclient:commons-httpclient:3.1' compile 'org.apache.commons:commons-lang3:3.5' }
Gradle 3.4+
使用java-library插件替換java插件
apply plugin: 'java-library'
新的依賴配置:implementation和api
dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' }
api和implementation兩種依賴的不同點(diǎn)在于:它們聲明的依賴其他模塊是否能使用。
api:當(dāng)其他模塊依賴于此模塊時(shí),此模塊使用api聲明的依賴包是可以被其他模塊使用。
implementation:當(dāng)其他模塊依賴此模塊時(shí),此模塊使用implementation聲明的依賴包只限于模塊內(nèi)部使用,不允許其他模塊使用。
api: 跟 2.x 版本的 compile完全相同
implementation:使用了該命令編譯的依賴,它僅僅對(duì)當(dāng)前的Module提供接口。例如我們當(dāng)前項(xiàng)目結(jié)構(gòu)如下
LibraryA 中引用了 LibraryC 的庫(kù),如果對(duì) LibraryC 的依賴用的是 implementation 關(guān)鍵字。 如下:
dependencies { . . . . implementation project(path:':libraryC') }
那么LibraryC 中的接口,僅僅只能給 LibraryA 使用,而我們的 App Module 是無法訪問到 LibraryC 提供的接口的,也就是將該依賴隱藏在內(nèi)部,而不對(duì)外部公開。這就是implementation關(guān)鍵字的作用。
在Google IO 相關(guān)話題的中提到了一個(gè)建議,就是依賴首先應(yīng)該設(shè)置為implement的,如果沒有錯(cuò),那就用implement,如果有錯(cuò),那么使用api指令,這樣會(huì)使編譯速度有所增快。
那為什么要這么做呢?
答案是: 1. 加快編譯速度。2. 隱藏對(duì)外不必要的接口。
為什么能加快編譯速度呢?
這對(duì)于大型項(xiàng)目含有多個(gè)Module模塊的, 以上圖為例,比如我們改動(dòng) LibraryC 接口的相關(guān)代碼,這時(shí)候編譯只需要單獨(dú)編譯LibraryA模塊就行, 如果使用的是api或者舊時(shí)代的compile,由于App Module 也可以訪問到 LibraryC,所以 App Module部分也需要重新編譯。當(dāng)然這是在全編的情況下。
compile(api)
這種是我們最常用的方式,使用該方式依賴的庫(kù)將會(huì)參與編譯和打包。
當(dāng)我們依賴一些第三方的庫(kù)時(shí),可能會(huì)遇到com.android.support沖突的問題,就是因?yàn)殚_發(fā)者使用的compile依賴的com.android.support包,而他所依賴的包與我們本地所依賴的com.android.support包版本不一樣,所以就會(huì)報(bào)All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes這個(gè)錯(cuò)誤。
provided(compileOnly)
只在編譯時(shí)有效,不會(huì)參與打包
可以在自己的module中使用該方式依賴一些比如com.android.support,gson這些使用者常用的庫(kù),避免沖突。
apk(runtimeOnly)
只在生成apk的時(shí)候參與打包,編譯時(shí)不會(huì)參與,很少用。
testCompile(testImplementation)
testCompile 只在單元測(cè)試代碼的編譯以及最終打包測(cè)試apk時(shí)有效。
debugCompile(debugImplementation)
debugCompile 只在 debug 模式的編譯和最終的 debug apk 打包時(shí)有效
releaseCompile(releaseImplementation)
Release compile僅僅針對(duì) Release 模式的編譯和最終的 Release apk 打包。
以上就是“Java用Gradle配置compile及implementation和api的區(qū)別是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。