0%

gralde依赖中的scope定义

对于只使用IntelliJ IDEA开发Java的同学,接触gradle的机会可能不是太多,或者说只借助于原生的Gralde-plugin可能都是模模糊糊的,只能大概的对应与maven的scope来边猜边用,对于使用android studio的同学可能借助于Android Plugin for Gradle,能够更直观的理解一些。但是可能不清楚对应的改变和原理。

gradle < 4.0.1android studio 2.x之前,支持的依赖方式如下:

Compile: 默认的依赖方式,任何情况下都会依赖
Provided: 只提供编译时依赖,打包时不会添加进去
Apk:只在打包Apk包时依赖(使用较少)
TestCompile:只在测试时依赖
DebugCompile:只在Debug构建时依赖
ReleaseCompile:只在Release构建时依赖

gradle >= 4.0.1android studio >= 3.0,支持的依赖方式如下:

compile: 弃用,被implementation替代
implementation: 实现依赖,同时会打入compileClasspath和runtimeClasspath
compileOnly: 编译时依赖,只会打入compileClasspath
annotationProcessor: 在编译中用于注解处理,以下会以Lombok举例
testAnnotationProcessor: 在测试编译中用于注解处理,以下会以Lombok举例
runtimeOnly:运行时依赖,只打包至runtimeClassPath
testImplementation:编译时只为测试构建相关依赖
testCompileOnly:测试编译时所使用的依赖,不打入运行时
testRuntimeOnly:测试运行时所使用的依赖

源代码依赖配置关系图
源代码依赖配置关系图
测试代码依赖配置关系图
测试代码依赖配置关系图

经常看到直接从maven repository中默认无脑复制依赖下来的时候都是

1
providedCompile group: 'org.projectlombok', name: 'lombok', version: '1.18.10'

或者

compile group: 'org.projectlombok', name: 'lombok', version: '1.18.10'         

在Gradle 5.0以上,会被禁止,4.x等后段的高版本编译时也会给出对应的报警
gradle5.0以上正确的方式应该如下:

compileOnly 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
testCompileOnly 'org.projectlombok:lombok:1.18.10'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.10'        

如果只配置了Compile,那么编译会报错(getter,setter等不会生成)
如果只配置了annotationProcessor,那么编译不会报错,但是会把lombok的依赖打进jar

针对gradle5.0以下,只需要做如下配置

compileOnly 'org.projectlombok:lombok:1.18.10'
testCompileOnly 'org.projectlombok:lombok:1.18.10'

参考