Gradle中的实现和编译有什么区别?
更新到android studio 3.0并创build一个新的项目后,我注意到,在build.gradle
有一个新的方法来添加新的依赖关系,而不是compile
有implementation
而不是testCompile
有testImplementation
例如:
implementation 'com.android.support:appcompat-v7:25.0.0' testImplementation 'junit:junit:4.12'
代替
compile 'com.android.support:appcompat-v7:25.0.0' testCompile 'junit:junit:4.12'
他们之间有什么区别,我应该使用什么。
这是Gradle推出的突破性改变之一:Google 在IO17 Gradle 3.0版中宣布的 3.0版
compile
configuration现在不推荐使用 ,应该用implementation
或api
replace
从gradle文档 :
dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' }
出现在
api
configuration中的依赖关系将被传递给图书馆的消费者,因此会出现在消费者的编译类path中。另一方面,
implementation
configuration中的依赖关系不会暴露给消费者,因此不会泄漏到消费者的编译类path中。 这带来了几个好处:
- 依赖关系不会泄漏到消费者的编译类path中,所以您将永远不会意外地依赖于传递依赖项
- 更快的编译感谢减less类path大小
- 当实现依赖关系发生变化时,重新编译会更less:消费者不需要重新编译
- 清理器发布:当与新的maven-publish插件结合使用时,Java库会生成POM文件,这些文件可以精确地区分编译库所需的内容和运行时使用库所需的内容(换句话说,不要混合编译图书馆本身所需要的东西,以及对图书馆编译所需的东西)。
编译configuration仍然存在,但不应该使用,因为它不会提供api和实现configuration提供的保证。
TL;博士:
只要用implementation
replacecompile
,用debugImplementation
compile
,用debugImplementation
compile
testCompile
用testImplementation
compile
androidTestImplementation
Compile
configuration已被弃用,应该由implementation
或api
replace。
您可以在https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation中阅读文档。;
简要的部分是 –
标准Java插件和Java库插件之间的主要区别在于后者引入了暴露给消费者的API的概念。 库是一个Java组件,意味着被其他组件所使用。 在多项目构build中,这是一个非常常见的用例,但是一旦有外部依赖项,也是如此。
该插件公开了两个可用于声明依赖关系的configuration:api和实现。 应该使用apiconfiguration来声明由库API导出的依赖关系,而应该使用实现configuration来声明组件内部的依赖关系。
有关更多解释,请参阅此图像。
- 如何只获得类名,而不是完整的path?
- 如何在构buildAndroid Studio项目时添加Stacktrace或debugging选项
- managedQuery()vs context.getContentResolver.query()vs android.provider.something.query()
- 无法获取连接工厂客户端
- Kotlin Android扩展和片段
- 用C或C ++编写Android应用程序?
- 我们可以从ContentProvider安装APK吗?
- 错误:更新到AS 2.4后无法初始化类com.android.ide.common.util.ReadWriteProcessLock
- 如何禁用主键