Java用?Gradle配置compile及implementation和api的區(qū)別
前言:
這個主要看Java項目所使用的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兩種依賴的不同點在于:它們聲明的依賴其他模塊是否能使用。
api:當其他模塊依賴于此模塊時,此模塊使用api聲明的依賴包是可以被其他模塊使用。
implementation:當其他模塊依賴此模塊時,此模塊使用implementation聲明的依賴包只限于模塊內(nèi)部使用,不允許其他模塊使用。
api: 跟 2.x 版本的 compile完全相同
implementation:使用了該命令編譯的依賴,它僅僅對當前的Module提供接口。例如我們當前項目結(jié)構(gòu)如下

LibraryA 中引用了 LibraryC 的庫,如果對 LibraryC 的依賴用的是 implementation 關(guān)鍵字。 如下:
dependencies {
. . . .
implementation project(path:':libraryC')
}那么LibraryC 中的接口,僅僅只能給 LibraryA 使用,而我們的 App Module 是無法訪問到 LibraryC 提供的接口的,也就是將該依賴隱藏在內(nèi)部,而不對外部公開。這就是implementation關(guān)鍵字的作用。
最佳實踐建議
在Google IO 相關(guān)話題的中提到了一個建議,就是依賴首先應該設(shè)置為implement的,如果沒有錯,那就用implement,如果有錯,那么使用api指令,這樣會使編譯速度有所增快。
那為什么要這么做呢?
答案是: 1. 加快編譯速度。2. 隱藏對外不必要的接口。
為什么能加快編譯速度呢?
這對于大型項目含有多個Module模塊的, 以上圖為例,比如我們改動 LibraryC 接口的相關(guān)代碼,這時候編譯只需要單獨編譯LibraryA模塊就行, 如果使用的是api或者舊時代的compile,由于App Module 也可以訪問到 LibraryC,所以 App Module部分也需要重新編譯。當然這是在全編的情況下。
版本依賴關(guān)鍵字詳解(2.0與3.0所有關(guān)鍵字)
compile(api)
這種是我們最常用的方式,使用該方式依賴的庫將會參與編譯和打包。
當我們依賴一些第三方的庫時,可能會遇到com.android.support沖突的問題,就是因為開發(fā)者使用的compile依賴的com.android.support包,而他所依賴的包與我們本地所依賴的com.android.support包版本不一樣,所以就會報All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes這個錯誤。
provided(compileOnly)
只在編譯時有效,不會參與打包
可以在自己的module中使用該方式依賴一些比如com.android.support,gson這些使用者常用的庫,避免沖突。
apk(runtimeOnly)
只在生成apk的時候參與打包,編譯時不會參與,很少用。
testCompile(testImplementation)
testCompile 只在單元測試代碼的編譯以及最終打包測試apk時有效。
debugCompile(debugImplementation)
debugCompile 只在 debug 模式的編譯和最終的 debug apk 打包時有效
releaseCompile(releaseImplementation)
Release compile僅僅針對 Release 模式的編譯和最終的 Release apk 打包。
到此這篇關(guān)于Java用 Gradle配置compile及implementation和api的區(qū)別的文章就介紹到這了,更多相關(guān)Java 配置compile 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java報錯:ClassCastException問題解決方法
異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的,下面這篇文章主要給大家介紹了關(guān)于Java報錯:ClassCastException問題解決方法,需要的朋友可以參考下2024-07-07
IntelliJ IDEA(2019)之mybatis反向生成的實現(xiàn)
這篇文章主要介紹了IntelliJ IDEA(2019)之mybatis反向生成,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
Java?中的整型數(shù)據(jù)類型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場景
Java中的整型數(shù)據(jù)類型包括byte、short、int和long,每種類型都有不同的內(nèi)存占用和取值范圍,選擇合適的整型類型取決于具體需求,如內(nèi)存敏感場景、性能考量和避免整數(shù)溢出,示例代碼展示了如何聲明和初始化不同整型變量,并打印它們的最大值,感興趣的朋友一起看看吧2025-03-03
IDEA啟動Tomcat報Unrecognized option: --add-opens=java
這篇文章主要為大家介紹了解決IDEA啟動Tomcat報Unrecognized option: --add-opens=java.base/java.lang=ALL-UNNAMED的方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-08-08
gateway網(wǎng)關(guān)與前端請求跨域問題的解決方案
這篇文章主要介紹了gateway網(wǎng)關(guān)與前端請求跨域問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

