title | date | categories | tags | description | ||
---|---|---|---|---|---|---|
10.Java Gradle插件 |
2021-01-28 |
|
|
|
apply ’java‘
JavaGradle └─src ├─main │ ├─java │ └─resources └─test ├─java └─resources
使用 Java 插件之后会为当前工程添加默认设置和约定,如源代码的位置、单元测试代码的位置、资源文件的位置等。 默认情况下,java插件约定 src/main/java 是 源代码存放目录。src/main/resources 是要打包的资源存放的目录,比如配置文件、图片之类的。 src/test/java 是单元测试用例存放的目录,当我们执行单元测试的时候,Gradle 会在这个目录下搜索单元测试用例进行执行。 src/test/resources是单元测试中使用的资源文件
main 和 test 是Java插件内置的两个源代码集合。我们也可以自己定义其他的。比如我们有一个vip版本。
sourceSets {
vip {
}
}
这样添加一个vip的 sourceSets 就好了。
如果我们想要更改默认的文件目录,也是在sourceSets中配置
sourceSets {
main {
java {
srcDir 'xxx'
}
resources {
srcDir 'xxxx'
}
}
}
这样写,就是更改了默认的 main sourceSets 的 java目录和 resources 目录。
这里再说一下这个SourceSet
SourceSet 是Java插件用于描述和管理源代码及其资源的一个概念,是Java源代码和资源文件的集合。通过SourceSet,可以非常方便的访问源代码目录,更改源代码目录等。
也可以针对不同的业务和应用对源代码分组。比如用于业务产品的 main SourceSet,用于单元测试的 test SourceSet
Java插件在 Project 下提供了 sourceSets 和 一个 sourceSets{} 闭包来访问和配置。
sourceSets 是一个 SourceSetContainer。跟我们的ExtensionContainer和 TaskContainer都很像。跟NamedDomainObjectContainer也很像。
那sourceSets里存放的都是都是 SourceSet对象。
apply 'java'
task printSourceSet {
doLast {
sourceSets.all {
println name
}
}
}
可以看到,默认是有 main 和 test 两个sourceSet的。
属性名 | 类型 | 描述 |
---|---|---|
name | String | 只读的,表示 SourceSet的名字,比如main, 比如 test |
output.classesDir | File | 该SourceSet 编译后的 class 文件存放目录 |
output.resourcesDir | File | 该SourceSet 编译后的资源目录 |
compileClasspath | FileCollection | 编译时候需要的 classpath |
java | SourceDirectorySet | SourceSet的Java源文件 |
java.srcDirs | Set | SourceSet的Java源文件 |
resources | SourceDirectorySet | SourceSet的资源文件 |
resources.srcDirs | Set | SourceSet资源文件所在目录 |
使用
sourceSets {
main {
java {
srcDir 'xxx'
}
resources {
srcDir 'xxxx'
}
}
}
也可以
sourceSets {
main {
java.srcDirs = ['src', 'xxx']
resources.srcDirs = ['src','xxx']
}
}
更详细的使用参考官方文档: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.SourceSetOutput.html
要使用第三方依赖,就要告诉Gradle依赖什么包?这个包从哪里能找到。
依赖什么是通过 dependencies 来指定
dependencies {
compile group:'com.squareup.okhttp3', name:'okhttp', verison:'3.7.1'
}
这里表示,我们想要依赖 okhttp3这个库。 也可以这样写。
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.7.1'
}
那这个库从哪里找呢。配置一下仓库
//配置仓库位置
repositories{
//仓库类型如jcenter库、ivy库、maven中心库、maven本地库、maven私服库等
mavenCentral()
mavenLocal()
maven {
uri "http"//xxxx
}
jcenter()
google()
//...
}
这样,Gradle就会帮我们去jcenter下载 okhttp3这个库。 之后,我们就可以在java中import了。
上面的这个基于库的依赖,是外部依赖。
还有项目依赖
dependencies {
compile project(:common)
}
这样配置后,项目中的 common 这个模块就可以呗依赖进来了。
还有文件依赖。
dependencies {
compile files('libs/a.jar', 'libs/b.jar'))
}
一般依赖项目中的jar包,我们就会这么写了。
如果依赖的太多,也可以使用 fileTree。指定依赖libs目录下,所有后缀名称为 jar的文件。
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
}
上述代码中 compile 是一个编译时依赖,Gradle 还提供了其他依赖,具体参考如下: compile:编译时依赖 runtime:运行时依赖 testCompile:测试时编译时依赖 testRuntime:仅在测试用例运行时依赖 archives:发布构件时依赖,如jar包等 default:默认依赖配置
在 gradle 3.4 里引入了新的依赖配置,如下:
新配置 | 弃用配置 | 行为 | 作用 |
---|---|---|---|
implementation | compile | 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。 对于大型多项目构建,使用 implementation 而不是 api/compile 可以显著缩短构建时间,因为它可以减少构建系统需要重新编译的项目量。 大多数应用和测试模块都应使用此配置。 | implementation 只会暴露给直接依赖的模块,使用此配置,在模块修改以后,只会重新编译直接依赖的模块,间接依赖的模块不需要改动 |
api | compile | 依赖项在编译时对模块可用,并且在编译时和运行时还对模块的消费者可用。 此配置的行为类似于 compile(现在已弃用),一般情况下,您应当仅在库模块中使用它。 应用模块应使用 implementation,除非您想要将其 API 公开给单独的测试模块。 | api 会暴露给间接依赖的模块,使用此配置,在模块修改以后,模块的直接依赖和间接依赖的模块都需要重新编译 |
compileOnly | provided | 依赖项仅在编译时对模块可用,并且在编译或运行时对其消费者不可用。 此配置的行为类似于 provided(现在已弃用)。 | 只在编译期间依赖模块,打包以后运行时不会依赖,可以用来解决一些库冲突的问题 |
runtimeOnly | apk | 依赖项仅在运行时对模块及其消费者可用。 此配置的行为类似于 apk(现在已弃用)。 | 只在运行时依赖模块,编译时不依赖 |
还是以 EasyGradle 为例,看一下各个依赖的不同: 项目里有三个模块:app,module1, module2 模块 app 中有一个类 ModuleApi 模块 module1 中有一个类 Module1Api 模块 module2 中有一个类 Module2Api 其依赖关系如下:
当 module1 使用 implementation 依赖 module2 时,在 app 模块中无法引用到 Module2Api 类
当 module1 使用 api 依赖 module2 时,在 app 模块中可以正常引用到 Module2Api 类,如下图
当 module1 使用 compileOnly 依赖 module2 时,在编译阶段 app 模块无法引用到 Module2Api 类,module1 中正常引用,但是在运行时会报错
反编译打包好的 apk,可以看到 Module2Api 是没有被打包到 apk 里的
当 module1 使用 runtimeOnly 依赖 module2 时,在编译阶段,module1 也无法引用到 Module2Api
作者:ZYLAB 链接:https://juejin.cn/post/6844903841230487560 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
项目的构建还是通过一系列 Gradle 插件提供的任务,下面是 Java 项目中常用的任务,具体如下:
任务名称 | 类型 | 描述 |
---|---|---|
compileJava | JavaCompile | 表示使用javac编译java源文件 |
processResources | Copy | 表示把资源文件复制到生成的资源文件目录中 |
classes | Task | 表示组装产生的类和资源文件目录 |
compileTestJava | JavaCompile | 表示使用javac编译测试java源文件 |
processTestResources | Copy | 表示把资源文件复制到生成的资源文件目录中 |
testClasses | Task | 表示组装产生的测试类和相关资源文件 |
jar | Jar | 表示组装jar文件 |
javadoc | Javadoc | 表示使用javadoc生成Java API文档 |
uploadArchives | Upload | 表示上传包含Jar的构建,使用archives{}闭包进行配置 |
clean | Delete | 表示清理构建生成的目录文件 |
cleanTaskName | Delete | 表示删除指定任务生成的文件,如cleanJar是删除jar任务生成的文件 |
源集任务
任务名称 | 类型 | 描述 |
---|---|---|
compileSourceSetJava | JavaCompile | 表示使用javac编译指定源集的源代码 |
processSouceSetResources | Copy | 表示把指定源集的资源文件复制到生成文件中的资源目录中 |
sourcesSetClasses | Task | 表示组装给定源集的类和资源文件目录 |
当运行任务的时候,列表中的任务名称中的 sourceSet 要换成你的SourceSet名称,比如main,执行的任务名称就是 compileMainJava
这里的类型,就是 创建Task的方法中的那个type。相当于指定了一下父类这个意思。
Java Gradle 插件中的常用属性都被添加到 Project 中,这些属性可以直接使用,具体如下:
属性名称 | 类型 | 描述 |
---|---|---|
sourceSets | SourceSetContauner | Java项目的源集,可在闭包内进行相关配置 |
sourceCompatibility | JavaVersion | 编译Java源文件使用的Java版本 |
targetCompatinility | JavaVersion | 编译生成类的Java版本 |
archivesBaseName | String | 打包成jar或zip文件的名称 |
manifest | Manifest | 用来访问和配置manifest清单文件 |
libsDir | File | 存放生成的类库目录 |
distsDir | File | 存放生成的发布的文件目录 |
gradle build 构建整个项目
gradle clean 删除build目录及其他构建生成的文件
gradle assemble 不执行单元测试,只编译和打包。这个任务在Android 中是打APK包。而且会打所有buildType的,包括release debug等。
gradle assembleRelease 这样就是只打release 包,但是在java中不知道有没有。在Android 中是有的。