Gradle学习笔记之第一个Gradle项目

前言

Gradle是Android构建的基本工具,因此作为Android研发,有必要系统地学一学Gradle,环境windows就可以。

创建gradle项目

我们既可以通过Android Studio创建基于Android的gradle项目,也可以通过gradle命令行创建gradle项目,以命令行为例,在一个空的目录里,执行以下命令:

D:\develop\gradle_test\gradle_demo0>gradle init

而后会让我们选择配置项,如应用类型、项目语言、项目是否包含多个模块、构建脚本语言、测试框架,并且给定项目名和启动类的包名:

D:\develop\gradle_test\gradle_demo0>gradle init
Starting a Gradle Daemon (subsequent builds will be faster)

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 1

Project name (default: gradle_demo0):
Source package (default: gradle_demo0): com.szc

> Task :init
Get more help with your project: https://docs.gradle.org/7.2/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 1m 15s
2 actionable tasks: 2 executed

gradle目录结构

得到的目录结构如下所示:
在这里插入图片描述
是不是很熟悉,跟用Android Studio创建新的安卓项目产生的目录结构基本是一样的。其中:

  • app包括业务逻辑代码及资源、测试代码及资源和构建脚本;
  • gradle则是包装器文件夹;
  • gradlew和gradlew.bat是包装器的启动脚本(若要执行本地安装的全局gradle,则不应执行该脚本);
  • settings.gradle是设置文件,定义项目及子项目名称信息。
    app目录结构如下所示:
    在这里插入图片描述
    更眼熟了,src包括业务逻辑代码及资源和测试代码及资源,build.gradle则是模块(因为本项目仅有一个模块,所以也是也是项目的)的构建脚本。

gradle常用命令

gradle指令要在含有build.gradle的目录中执行:
在这里插入图片描述

修改maven仓库地址

在gradle安装目录的init.d目录下,新建以.gradle结尾的文件,如init.gradle,输入以下内容:

allprojects {
    repositories { // 项目用到的依赖,从repositories指定的仓库中获取,获取时,遍历以下仓库,找到则立刻返回,全部找不到则报错
        mavenLocal() // maven本地仓库,要配置M2_HOME环境变量
        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } // name属性非必须,url必须
        maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
        mavenCentral() // maven中心仓库
    }
    buildscript { // 构建脚本build.gradle需要的额外依赖,从buildscript.repositories中获取
        repositories {
            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
            maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }
            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
        }
    }
}

保存过后,以如下脚本为例,查看构建的速度:

/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java application project to get you started.
* For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
* User Manual available at https://docs.gradle.org/7.2/userguide/building_java_projects.html
*/

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit test framework.
    testImplementation 'junit:junit:4.13.2'

    // This dependency is used by the application.
    implementation 'com.google.guava:guava:30.1.1-jre'
}

application {
    // 定义应用的入口类
    mainClass = 'com.szc.App'
}

命令的执行效果如下:

D:\develop\gradle_test\gradle_demo0\app>gradle build

BUILD SUCCESSFUL in 16s
7 actionable tasks: 7 executed

启用init.gradle的方法

有以下四种方法,优先级依次降低:

  1. 在命令行中指定文件:
gradle --init-script somedir/init.gradle -q taskeName

可以通过多次输入该命令来指定多个init文件
2. 将.gradle文件放到USER_HOME/.gradle目录下
3. 将.gradle文件放到USER_HOME/.gradle/init.d目录下
4. 将gradle文件放到GRADLE_HOME/init.d目录下

若存在上述方法的多种方法,则会按优先级依次执行对应目录下的所有gradle文件,某个目录下的gradle文件执行顺序,由文件名的字母序决定。

关于gradle仓库

mavenLocal()本地仓库的位置:决定优先级如下依次降低:

  1. USER_HOME/.m2/settings.xml;
  2. M2_HOME/conf/settings.xml;
  3. USER_HOME/.m2/respository;
  4. maven本地仓库的默认路径

jcenter()仓库在gradle老版本中支持,但现在已经被废弃了,替换成了mavenCentral()

依赖下载后的保存路径:

  • 若依赖在本地仓库中已经存在,则直接复用;
  • 否则,将其下载到GRADLE_USER_HOME/caches/modules-2/files-2.1/目录中;
  • 若GRADLE_USER_HOME未指定,则保存到USER_HOME/.gradle/caches/modules-2/files-2.1/目录中

上述方式均会存放所有依赖的特定版本的pom文件、源码jar和二进制jar。

gradle包装器

gradle wrapper(gradle包装器)是对gradle的封装,用于解决开发中不同项目用的gradle版本不一的问题,核心是在gradlew或gradlew.bat脚本中指定CLASSPATH:
在这里插入图片描述
默认就是gradlew或gradlew.bat脚本所在项目中,gradle/wrapper目录里的gradle-wrapper.jar,因此gradle和gradlew所指定的gradle版本可能不一样(但命令用法是一样的),gradlew指定的gradle版本,可通过gradle/wrapper/gradle-wrapper.properties文件里的distributionUrl查看或修改:
在这里插入图片描述
文件中的字段含义如下表所示:
在这里插入图片描述
gradle包装器下载gradle时,下载得到的压缩包存放路径为:distributionBase/distributionPath;压缩包解压后的存放路径为:zipStoreBase/zipStorePath

我们可以在项目根目录下执行gradle wrapper --gradle-version=xx来修改gradle-wrapper.properties中的包装器版本号:

D:\develop\gradle_test\gradle_demo0>gradle wrapper --gradle-version=7.1

BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

而后,通过gradlew.bat build或gradlew build命令进行构建,此时若指定版本的gradle不存在,则会进行下载到gradle-wrapper.properties中的指定目录:

D:\develop\gradle_test\gradle_demo0>gradlew.bat build
Downloading https://services.gradle.org/distributions/gradle-7.1-bin.zip
..........10%...........20%...........30%..........40%...........50%...........60%..........70%...........80%...........90%...........100%

Welcome to Gradle 7.1!

Here are the highlights of this release:
- Faster incremental Java compilation
- Easier source set configuration in the Kotlin DSL

For more details see https://docs.gradle.org/7.1/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 43s
7 actionable tasks: 7 executed

得到的指定版本的gradle存放目录及结构如下所示(我的GRADLE_USER_HOME为D:\develop\Android\gradle):

同时,gradlew还会在GRADLE_USER_HOME/caches中构建该版本gradle的缓存,如下所示:
在这里插入图片描述
再使用相同版本的gradle包装器构建项目时,就不会重新下载了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值