Skip to content

Latest commit

 

History

History
346 lines (242 loc) · 11.6 KB

10.Java Gradle插件.md

File metadata and controls

346 lines (242 loc) · 11.6 KB
title date categories tags description
10.Java Gradle插件
2021-01-28
Gradle
Gradle

使用

apply ’java‘

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

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的。

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、api 和 implementation

上述代码中 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 其依赖关系如下:

implementation 依赖

当 module1 使用 implementation 依赖 module2 时,在 app 模块中无法引用到 Module2Api 类

api 依赖

当 module1 使用 api 依赖 module2 时,在 app 模块中可以正常引用到 Module2Api 类,如下图

compileOnly 依赖

当 module1 使用 compileOnly 依赖 module2 时,在编译阶段 app 模块无法引用到 Module2Api 类,module1 中正常引用,但是在运行时会报错

反编译打包好的 apk,可以看到 Module2Api 是没有被打包到 apk 里的

runtimeOnly 依赖

当 module1 使用 runtimeOnly 依赖 module2 时,在编译阶段,module1 也无法引用到 Module2Api

作者:ZYLAB 链接:https://juejin.cn/post/6844903841230487560 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java插件添加的任务

项目的构建还是通过一系列 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 插件添加的属性

Java Gradle 插件中的常用属性都被添加到 Project 中,这些属性可以直接使用,具体如下:

属性名称 类型 描述
sourceSets SourceSetContauner Java项目的源集,可在闭包内进行相关配置
sourceCompatibility JavaVersion 编译Java源文件使用的Java版本
targetCompatinility JavaVersion 编译生成类的Java版本
archivesBaseName String 打包成jar或zip文件的名称
manifest Manifest 用来访问和配置manifest清单文件
libsDir File 存放生成的类库目录
distsDir File 存放生成的发布的文件目录

构建Java项目

gradle build 构建整个项目

gradle clean 删除build目录及其他构建生成的文件

gradle assemble 不执行单元测试,只编译和打包。这个任务在Android 中是打APK包。而且会打所有buildType的,包括release debug等。

gradle assembleRelease 这样就是只打release 包,但是在java中不知道有没有。在Android 中是有的。