关于gradle:Gradle系列之Java-Gradle插件

6次阅读

共计 6383 个字符,预计需要花费 16 分钟才能阅读完成。

原文发于微信公众号 jzman-blog,欢送关注交换。

上篇文章中理解了 Gradle 插件相干常识以及如何自定义一个 Gradle 插件,为不便了解能够先浏览上面几篇文章:

  • Gradle 系列之初识 Gradle
  • Gradle 之 Groovy 根底篇
  • Gradle 系列之构建脚本根底
  • Gradle 系列之意识 Gradle 工作
  • Gradle 系列之 Gradle 插件

本篇文章次要来学习 Java Gradle 插件相干的常识,因为 Java Gradle 插件相干的内容也是 Android Gradle 插件的根底。应用 Gradle 来构建我的项目无非就是帮忙开发者做一些重复性的工作,如配置第三方依赖、编译源文件、单元测试、打包公布等,应用相应的 Grade 插件可不便我的项目的构建以及肯定水平上进步开发效率,上面是明天学习的次要内容:

  1. Java Gradle 插件的应用
  2. Java 插件约定的我的项目构造
  3. 配置第三方依赖
  4. 如何构建 Java 我的项目
  5. SourceSet 源集概念
  6. Java 插件可增加的工作
  7. Java 插件可增加的属性
  8. 多我的项目构建
  9. 公布构件

Java Gradle 插件的应用

应用一个 Gradle 插件应用的是 Project 的 apply() 办法:

//java 是 Java Gradle 插件的 plugin id
apply plugin:'java'

应用 Java 插件之后会为以后工程增加默认设置和约定,如源代码的地位、单元测试代码的地位、资源文件的地位等,个别应用默认设置即可。

Java 插件约定的我的项目构造

Java 插件设置一些默认的设置和约定,上面来看一看 Java 我的项目的默认工程目录,目录构造根本如下:

JavaGradle
└─src
    ├─main
    │  ├─java
    │  └─resources
    └─test
        ├─java
        └─resources

下面目录构造中,src/main/java 默认是源代码寄存目录,src/main/resources 是资源文件、配置文件等目录,arc/test 上面的目录当然是与其绝对应的单元测试相干文件的存储目录,main 和 test 是 Java Gradle 插件内置的两个源代码汇合,当然除此之外能够本人定义其余源代码汇合,定义形式如下:

apply plugin : 'java'

sourceSets{
    // 指定新的源代码汇合
    vip{}}

而后在 src 上面创立相应的 java 和 resources 目录,具体目录下寄存的文件内容与默认相似,默认目录构造如下:

// 源代码目录
src/vip/java
// 资源文件目录
src/vip/resource

上述目录构造都是 Java Gradle 插件默认实现的,当然还能够批改具体目录的地位,配置形式如下:

sourceSets{
    // 批改默认目录,上面还是和默认地位一样,如需配置其余目录批改即可
    main{
        java{srcDir 'src/java'}
        
        resources{srcDir 'src/resources'}
        
    }
}

配置第三方依赖

开发过程中总会应用第三方 jar 包,此时就要对 jar 包进行依赖配置,依赖的仓库类型以及仓库的地位,具体依赖时 Gradle 就会从配置的仓库中去寻找相干依赖,配置仓库和配置具体依赖参考如下:

// 配置仓库地位
repositories{
    // 仓库类型如 jcenter 库、ivy 库、maven 核心库、maven 本地库、maven 私服库等
    mavenCentral()
    mavenLocal()
    maven {uri "http"//xxxx}
    jcenter()
    google()
    //...
}

// 配置具体的依赖
dependencies{// 依赖三要素:group( 组别)、name(名称)、version(版本)
    // 别离对应 Maven 中的 GAV(groupid、artifactid、version)
    
    // 残缺写法
    compile group: 'com.squareup.okhttp3', name: 'okhttp', version:'3.0.1'
    // 简写
    compile 'com.squareup.okhttp3:okhttp:3.0.1'
}

上述代码中 compile 是一个编译时依赖,Gradle 还提供了其余依赖,具体参考如下:

compile:编译时依赖
runtime:运行时依赖
testCompile:测试时编译时依赖
testRuntime:仅在测试用例运行时依赖
archives:公布构件时依赖,如 jar 包等
default:默认依赖配置 

在 Gradle 3.0 之后还会有 implementation、api 来代替 compile,这里就不多说这两个依赖形式了,对于新 API 的学习不是本文的重点,Java Gradle 插件还反对为不同的源代码汇合指定不同的依赖,具体参考如下:

// 为不同的源代码汇合配置不同的依赖
dependencies{
    // 配置格局:sourceSetCompile、sourceSetRuntime
    mainCompile 'com.squareup.okhttp3:okhttp:3.0.1'
    vipCompile 'com.squareup.okhttp3:okhttp:2.0.1'
}

下面介绍的是某个内部库的依赖,除此之外在开发中还会遇到 Module 的依赖、文件的依赖,实际上 Module 的依赖实际上就是某个子项目的依赖,文件以来个别就是 jar 包的依赖。

在 Gradle 系列之构建脚本根底这篇文章中曾经晓得构建某个子项目必须在 setting.gradle 文件中应用 include 关键字将子项目引入进来,这里也是一样,当初 setting.gradle 文件中要依赖的我的项目引入进来,而后依照如下形式依赖某个子项目,具体如下:

// 依赖一个子项目
dependencies{
    //setting.gradle 文件中 include ':childProject'
    
    // 依赖子项目
    compile project('childProject')
}

文件依赖次要就是 jar 包的依赖,个别都是将 jar 包放在我的项目的 libs 目录下,而后在起来 jar 包,具体参考如下:

// 依赖一个 jar 包
dependencies{
    // 配置单个 jar
    compile file('libs/java1.jar')
    // 配置多个 jar
    compile files('libs/java1.jar','libs/java2.jar')
    // 批量配置 jar, 配置好 jar 所在门路,会将后缀为 jar 的所有文件依赖到我的项目中
    compile fileTree(dir:'libs',include:'*.jar')
}

如何构建 Java 我的项目

Gradle 中所有的操作都是基于工作的,Java Gradle 插件同样内置了一系列的工作帮忙咱们构建我的项目,执行 build 工作 Gradle 就开始构建以后我的项目了,能够应用 gradlew build 开始执行构建工作,Gradle 会编译源代码文件、解决资源文件、生成 jar 包、编译测试代码、运行单元测试等。

如在 Android 开发中有个 clean 工作,执行 clean 操作就会删除 build 文件夹以及其余构建我的项目生成的文件,如果编译出错能够尝试向 clean 而后 build。此外还有 check 工作,该工作会在单元测试的时候应用到,javadoc 工作能够不便生成 Java 格局的 doc api 文档,学习 Java 我的项目的构建目标还是为了学习 Android 我的项目构建做筹备,所以如何应用 Gradle 构建一个 Java 我的项目就到此为止。

SourceSet 源集概念

这一大节来认识一下 SourceSet,这也就是前问中提到的源代码汇合,它是 Java Gradle 插件用来形容和治理源代码及其资源的一个抽象概念,是一个 Java 源代码文件和资源文件的汇合,故能够通过源代码汇合配置源代码文件的地位、设置源代码汇合的属性等,源集能够针对不同的业务将源代码分组治理,如 Java Gradle 插件默认提供的 main 和 test 源代码目录,一个用于业务代码,另一个用于单元测试,十分不便。

Java Gradle 插件在 Project 下提供一个 sourceSet 属性以及 sourceSet{} 闭包来拜访和配置源集,sourceSet 是一个 SourceSetContainer, 源集的罕用属性如下:

// 比方 main、test 等示意源集的名称
name(String)
// 示意源集编译后的 class 文件目录
output.classDir(File)
// 示意编译后生成的资源文件目录
output.resourcesDir(File)
// 示意编译后源集所需的 classpath
compileClasspath(FileCollection)
// 示意该源集的 Java 源文件
java(SourceDirectorySet)
// 示意该源集的 Java 源文件所在目录
java.srcDirs(Set)
// 示意源集的资源文件
resources(SourceDirectorySet)
// 示意该源集的资源文件所在目录
resources.srcDirs(Set)

上面是设置 main 这个源集的输入目录,参考如下:

// 设置某个源集的属性
sourceSets{
    main{
        // 源集名称只读
        println name
        // 其余属性设置
        // 从 4.0 开始曾经被过期。代替的是 dir
        output.classesDir = file("a/b")
//        output.dir("a/b")
        output.resourcesDir = file("a/b")
        //....
    }
}

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 工作生成的文件
自定义源集工作 (SourceSet 是具体的源集名称)
compileSourceSetJava JavaCompile 示意应用 javac 编译指定源集的源代码
processSouceSetResources Copy 示意把指定源集的资源文件复制到生成文件中的资源目录中
sourcesSetClasses Task 示意组装给定源集的类和资源文件目录

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 寄存生成的公布的文件目录

多我的项目构建

应用 Gradle 进行多个我的项目的构建,个别都是一个主我的项目依赖其余的子模块我的项目,是否构建这些子项目次要在 Setting.gradle 文件中配置,是否应用这些子项目则必须要在主我的项目中配置我的项目依赖,上文中承受过依赖的三种形式:库依赖、我的项目依赖和文件依赖,这里应用到的就是我的项目依赖,多我的项目配置中常常应用到 subprojects 和 allprojects,具体如下:

// 子项目对立配置
subprojects{
    // 配置子项目都应用 Java Gradle 插件
    apply plugin: 'java'
    // 配置子项目都是用 Maven 核心库
    repositories{mavenCentral()
    }
    // 其余通用配置
    //...
}
// 全副我的项目对立配置
allprojects{
    // 配置所有我的项目都应用 Java Gradle 插件
    apply plugin: 'java'
    // 配置所有我的项目都是用 Maven 核心库
    repositories{mavenCentral()
    }
    // 其余通用配置
    //...
}

公布构件

Gradle 构建的产物,个别称之为构件,一个构建能够是一个 jar 包、zip 包等,那么如何公布构件呢,上面介绍如何公布一个 jar 构件到我的项目本地文件夹或 mavenLocal() 中,具体如下:

/**
 * 公布构件到我的项目文件夹 / 或 mavenLocal()
 */
apply plugin : 'java'
// 生成 jar 的工作,相似于自定义 wrapper
task publishJar(type:Jar)
// 构件版本
version '1.0.0'
// 构件通过 artifacts{} 闭包配置
artifacts{archives publishJar}
// 构件公布上传
uploadArchives{
    repositories{
        flatDir{
            name 'libs'
            dirs "$projectDir/libs"
        }
        // 将构建公布到 mavenLocal()
        mavenLocal()}
}

执行 uploadArchives 工作就会在相应的地位生成相应的 jar 文件,执行命令如下:

// 执行 uploadArchives
gradle uploadArchives

执行胜利之后,就会在我的项目的 libs 目录下看到生成的 jar 文件,如下图所示:

执行胜利之后,就会在用户的 .m2/repository 目录下看到生成的 jar 文件,如下图所示:

上面是如何将 jar 公布到搭建的 maven 私服上,代码参考如下:

/**
 * 公布构件到 maven 私服
 */
apply plugin : 'java'
apply plugin : 'maven'
// 生成 jar 的工作,相似于自定义 wrapper
task publishJar(type:Jar)
// 构件版本
version '1.0.0'
// 构件通过 artifacts{} 闭包配置
artifacts{archives publishJar}
// 构件公布上传
uploadArchives{
    repositories{
        mavenDeployer{repository(url:'http://xxx'){
                // 仓库用户名和明码
                authentication(userName:'username',password:'pass')
            }
            snapshotRepository(url:'http://xxx'){authentication(userName:'username',password:'pass')
            }
        }
    }
}

上传过程也是执行 uploadArchives 工作,有 maven 私服的能够尝试一下,对于 Java Gradle 插件的学习就到此为止,下一篇正式进入 Android Gradle 插件的学习,能够关注公众号:躬行之(jzman-blog),一起交流学习。

正文完
 0