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

news2024/10/6 16:31:04

文章目录

  • 前言
  • 创建gradle项目
  • gradle目录结构
  • gradle常用命令
  • 修改maven仓库地址
  • 启用init.gradle的方法
  • 关于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包装器构建项目时,就不会重新下载了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生个人网页模板 学生个人网页设计作品 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

git原理和命令以及工具

原理 工作区、暂存区和版本库 分支结构 origin 对象模型 命令 配置 $ git config --global user.name “John Doe” $ git config --global user.email johndoeexample.com 针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --globa…

52、训练paddleSeg模型,部署自己的模型到OAK相机上

基本思想:简单记录一下训练过程,数据集在coco基础上进行,进行筛选出杯子的数据集,然后进行训练,比较简单, 从coco数据集中筛选出杯子的数据集,然后在labelme数据集的基础上,转成padd…

学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

NATAPP 访问vue-cli启动的项目

由于疫情原因,最近又静默居家办公了,由于项目需要,不得不再使用一下natapp了,这个东西两年前就用过了,不过以前访问的不是vue-cli项目,特此记录一下,因为这里有个坑,上午搞了半天没搞…

APP逆向案例之(二)对加固APP进行分析和破解

说明:对加固APP进行分析和破解,对发现新版本提示关掉 1、先对APP窗口类行进HOOK,确定窗口提示用的是那个类。 android hooking watch class android.app.AlertDialog 2、发现一个非常明显的函数 setCancelable objection -g com.hello.qq…

50个html+css+js项目小练习(二:动画的倒计时效果)

2.animated-navigation 实现效果: 倒计时321后显示go数字依次从x轴负方向,顺时针倒下去 xy第一个数(0,y)—>(-x,0) 第一个数字倒下去的同时,第二个数从x轴正方向升起 第二个数(x…

1. 开篇:既简单又复杂的基础框架

同样的基础但不简单 之前在写 《从 0 开始深入学习 Spring》 小册时,阿熊提到过一件事:学习 JavaEE 开发的第一个框架,大多数是推荐 MyBatis 的,因为它相对简单,学习起来也相对轻松。不过不要因为 MyBatis 入门简单&a…

【电商】管理后台篇之安全、菜单、通知管理

系统管理第一篇我们介绍了账号管理相关的业务,这一篇我们介绍下其他几个常见的业务:安全管理、菜单管理和通知管理。 本篇介绍的几个常见业务如下: 安全管理:监控每个账号的登录情况和操作情况通知管理:给使用后台系统…

[附源码]计算机毕业设计JAVA企业信息网站

[附源码]计算机毕业设计JAVA企业信息网站 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis M…

自定义qtquick 插件模块,支持qmldesigner

自定义qtquick 插件模块,支持qmldesigner wmxModule.pro #------------------------------------------------- # # Project created by wmx # #-------------------------------------------------QT core qml quickTARGET wmxModule TEMPLATE lib CONF…

图像处理QPixmap、Picture、QBitmap

QPixmap 类是一种可用作绘制设备的屏幕外图像表示形式。 QPixmap可以使用QLabel或QAbstractButton的子类之一可以轻松显示在屏幕上 QPixmap 对象可以按值传递,因为 QPixmap 类使用隐式数据共享,也可以流式传输。 QPixmap可以和QImage之间进行转换&…

【关于lombok框架一文秒懂】

目录 1. Lombok框架 2. 安装lombok插件 1. Lombok框架 Lombok框架是用于在编译期自动生成相关代码的,例如:Setters & Getters、hashCode()、equals()、toString()、无参数构造方法、全参数构造方法等。 相关的注解有: Data&#xff1…

python中的编码格式

1- 字符集和编码 1) 初代编码 – ASCII 1- 物理机与电脑的交互:物理机中有个组件叫二极管, 可以通过电流通过二极管显示的高电平和低电平来记录信号。 2- 二极管的高电平和低电平则被计算机解读为0 和 1 3- 多个0和1拼接起来成为了二进制数据…

自动化测试框架设计原理详解

一、自动化测试场景 1、测试四象限 并不是所有测试类型都适合自动化。哪些测试更适合自动化?哪些更适合手工测试? 根据Brain Marick提出的测试四象限,我们可以对测试进行归类,将其划分到4个象限中,以解答这些问题,如下图所示。 第一象限:面向技术和指导开发,该象限中…

ActivityPub 笔记

ActivityPub 协议是一个去中心化的社交网络协议,其基于 ActivityStreams 2.0 数据格式。 在 ActivityPub 协议里,一个用户在服务器上的角色为“参与者(actor)”。用户在不同的服务器上的角色为不同的“参与者”。每一名“参与者”…

LSTM和GRU

LSTM和GRU RNN的优缺点 优点: 可以捕获序列之间的关系;共享参数。 缺点: 存在梯度消失和梯度爆炸问题;RNN的训练是一个比较困难的任务;无法处理长序列问题。 LSTM LSTM可以处理长序列问题,同样在之前…

openssl做文件处理(base64,MD5,sha256等)

这次使用openssl,发现openssl不仅可以用来做加密和解密,实际上也可以用来做文件的处理,比如base64转码、解码,文件md5的计算等。实现这些,即可以从命令行去做,也可以通过代码去实现。 1. 命令行操作 1. ba…

【ML特征工程】第 5 章 :分类变量:机器鸡时代的鸡蛋计数

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

想做副业没有方向,这三条告诉你什么是副业思维

怎样副业赚钱?教你几招,掌控自己的固有思维 你了解钱是怎么来的吗?你如果弄不懂这一点,你也是很难赚到钱的。 钱不是苦的,辛苦努力挣的基本都是一点钱。 假如将你的工作时长换为钱,你可以清晰地赚多少钱…