Gradle系列之Java Gradle插件

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

上篇文章中了解了 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),一起交流学习。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


安装环境都很简单,就是下载工具需要在华为开发者联盟里注册,然后认证,扫码认证我这边是不可以的,人工认证需要两个工作日审核安装成功之后遇到了很多报错,网上都是可以解决的,遇到下面这个报错网上查了很多方式也解决不了,于是记录一下  找了很久,发现网上说的我都配置了,添加 allow
上传的方式有两种,第一种是通过bintray官方出的插件bintray/gradle-bintray-plugin第二种是一个国外组织开源的插件novoda/bintray-release 这里讲bintray/gradle-bintray-plugin  1.在项目根目录下的 build.gradle 添加插件依赖 dependencies{classpat
转载自: 完美解决Error:SSLpeershutdownincorrectly打开gradle文件夹下的gradle-wrapper文件修改其中的配置文件将红色区域修改为http://services.gradle.org/distributions/等待编译完成
https://www.jianshu.com/p/9220227cdfb3buildscript{ext.kotlin_version='1.2.71'repositories{google()jcenter()}dependencies{//classpath'com.android.tools.build:gradle:3.1.0-alpha09'
Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@sina.com发布库到仓库mavenjcenterJitPackMD目录目录通过AS创建aar的步骤发布到Github仓库【推荐】创建项目配置项目构建并上传上传
 跟着教程做的,已经有了JDK,直接进行后面的步骤,下载安装AndroidSDK没有FQ,教程里的网址打不开,就换了个。网址http:/ools.android-studio.org/index.php/sdk下的.exe  nextinstall然后就是漫长的等待 ……先这样吧开始下载AndroidStudio,网址http://www.and
今天更新了universal-image-loader-1.9.5.jar文件,studio死活找不到其中相关的类,上网百度试了很多办法,总算解决了,具体方法跟一篇老外的帖子的差不多,这里分享下。 解决步骤:Somethingwentwronginincrementalbuildsystem.Oneofthisshouldhelp:MenuBuild->Rebuild
https://blog.csdn.net/zxc514257857/article/details/80425711编写不易,如有转载,请声明出处:梦回河口:https://blog.csdn.net/zxc514257857/article/details/80425711报错一:Error:Unabletofindmethod'com.android.build.gradle.tasks.factory.AndroidJavaCompile.setDepe
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow                     创建兼容AndroidStudio和eclipse的AS工程虽然我的博客名叫eclipse_xu,但是我已经将
gradle跳过测试直接编译gradlebuild-xtest  根据build.gradle和setting.gradle文件生成idea项目:gradleidea  gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不是所有人都对gradle很熟悉,下面的方法可以把gradle转成maven项目,前提gradle项
本地仓库配置配置环境变量GRADLE_USER_HOME,并指向你的一个本地目录,用来保存Gradle下载的依赖包。 远程仓库配置一般Gradle、maven从中央仓库mavenCentral()http:/epo1.maven.org/maven2/下载依赖包,但是在国内下载速度巨慢,我们只能使用国内的镜像。所以每个Gradle构建的项目
what:Buildtool(构建工具)是从源代码自动创建可执行应用程序的程序。构建包括将代码编译,链接和打包成可用或可执行的形式。在小项目中,开发人员通常会手动调用构建过程。这对于较大的项目来说是不实际的,在这些项目中,很难跟踪需要构建的内容,构建过程中的顺序和依赖关系。使用自动化工
说明:该示例为在windows系统下自动化部署springboot架构:springboot+github+gradle+jdk8各种配置步骤及截图说明:1、配置git,gradle及jdk  系统管理→全局工具配置  说明:其中git配置项中的PathtoGitexecutable要指到git.exe文件,maven的配置方式和gradle类似
AndoridStudio模块化开发相关配置下面以宿主APP模块和Uer_Module模块为例:第一步:在项目根目录gradle.properties配置文件中添加如下代码isNeedUserModule=true#isNeedUserModule=false 第二步在user_module中的build.gradle文件中加入了如下代码来控制此库是library还
buildtools构建工具能够帮助你创建一个可重复的、可靠的、携带的且不需要手动干预的构建。构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。如下图所示,展示了所
Git及用法Git是目前世界上最先进的分布式版本控制系统。Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上
打release包的时候,出现这个玩意,但debug直接跑apk又没问题。Causedby:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:ExpectedanamebutwasSTRINGatline1column99path$[0].apkInfo.versionNameatcom.google.gson.internal.bind.
android\gradle\wrapper\gradle-wrapper.properties由distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.12.1-all.
1.上传本地仓库1.1build.gradle项目设置plugins{id'java'id'maven'//引入maven插件}group'com.inkyi'//包名version'1.0.1-SNAPSHOT'//版本号1.2 build.gradle上传设置//指定上传的路径deflocalMavenRepo='file://'+new
Gradle的Emas服务插件会加载您下载的aliyun-emas-services.json文件。请修改工程的build.gradle使用该插件。配置步骤如下:1.修改项目级目录下build.gradle({project}/build.gradle):1buildscript{2repositories{3maven{4url'http://maven.aliyun.com