Gradle 进阶学习 之 build.gradle 文件

  1. build.gradle 是什么? 想象一下,你有一个大型的乐高项目,你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中,build.gradle 就是这个清单,它告诉计算机如何构建(组合)你的软件项目。
  2. 为什么每个项目都有一个 build.gradle 文件? 每个项目都像是一个独立的乐高套装,每个套装都有自己的清单来确保所有的积木(代码和资源)都能正确地组合在一起。这个清单就是 build.gradle 文件。
  3. build.gradle 文件里有什么? 在这个清单中,你会指定你的项目需要哪些积木(依赖库),这些积木的版本是什么,以及一些特殊的构建规则(比如如何编译代码)。
  4. 什么是 Project 实例? 可以把 Project 实例想象成一个项目经理,它负责管理你的乐高项目。build.gradle 文件中的配置实际上是在告诉这个项目经理如何管理项目。
  5. Root Project 和 Child Project 是什么? 如果你有一个大型的乐高项目,它可能由几个小项目组成。Root Project 就像是总负责人,它可以管理所有的小项目(Child Project)。在 Root Project 的 build.gradle 文件中,你可以为所有这些小项目设置一些共同的规则,比如它们都需要哪些通用的积木或者如何找到这些积木。

build 文件中常见的属性和方法如下所示:

Gradle的build 文件中常见的属性和方法

1、常见属性代码

1.1 JDK版本兼容性设置

  • sourceCompatibility: 指定使用哪个版本的JDK语法来编译源代码。这与编译环境有关,且需要Java插件支持。

    sourceCompatibility = 1.8
    
  • targetCompatibility: 指定生成特定于某个JDK版本的class文件。这与运行环境有关,同样需要Java插件支持。

    targetCompatibility = 1.8
    

1.2. 字符集设置

  • 编译Java选项字符集: 设置业务编码的字符集,用于源码解码。

    compileJava.options.encoding "UTF-8"
    
  • 编译测试Java选项字符集: 设置测试编码的字符集,同样用于源码解码。

    compileTestJava.options.encoding "UTF-8"
    
  • Java编译任务字符集: 在编译Java文件时指定使用UTF-8字符集,这影响源文件的编码。

    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
    
  • Javadoc任务符集: 在生成Javadoc文档时指定使用UTF-8字符集,这影响文档的编码。

    tasks.withType(Javadoc) {
        options.encoding = "UTF-8"
    }
    
  • 提示1: group+name+version 的格式类似于Maven中的 group+artifactId+version,用于标识项目的唯一性。

  • 提示2: 设置encoding属性可以解决业务代码和测试代码中的中文乱码问题。

2、仓库配置 (Repositories)

在Gradle中,仓库的配置顺序很重要,因为Gradle会按照配置的顺序从上到下依次搜索所需的jar包。一旦找到所需的依赖,Gradle将停止搜索,继续进行构建。

repositories {
    // 使用本地文件系统的仓库,通常不推荐使用
    maven { url 'file:///D:/repos/mavenrepos3.5.4' }
    maven { url "$rootDir/lib/release" }

    // 指定查找Maven的本地仓库,通常Gradle会自动配置
    mavenLocal()

    // 指定查找Maven的私服或第三方镜像仓库
    maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public" }
    maven { name "Bstek"; url "https://nexus.bsdn.org/content/groups/public/" }

    // 指定查找Maven的中央仓库,这是默认的远程仓库
    mavenCentral()

    // 指定查找Google的远程仓库
    google()
}

2.1 仓库配置说明

  1. 本地文件系统仓库:通过file协议指定本地磁盘目录作为仓库,这种方式不常用。

  2. Maven本地仓库mavenLocal()配置允许Gradle在本地Maven仓库中查找依赖。

  3. 第三方镜像仓库:例如AlibabaBstek,这些是公共的Maven仓库镜像,通常用于加速依赖下载,特别是在某些地区访问Maven中央仓库速度较慢时。

  4. Maven中央仓库mavenCentral()配置允许Gradle查找默认的Maven中央仓库,这是最常用的远程仓库之一。

  5. Google仓库google()配置允许Gradle查找Google的远程仓库,这通常包含了一些Android开发常用的库。

2.2 注意事项

  • Gradle默认配置了Maven中央仓库,通常不需要手动添加。
  • 在配置私服或第三方镜像时,需要确保网络可以访问这些仓库。
  • 仓库配置应该根据项目的实际需求和网络环境进行调整。

3、allprojects和subprojects配置

在Gradle中,allprojectssubprojects允许你为多个项目(包括根项目和所有子项目)统一配置一些构建设置。

  • allprojects:对根项目以及所有子项目进行统一配置。
  • subprojects:仅对所有子项目进行统一配置。
// 对所有项目(包括根项目和子项目)配置一个名为 'hello' 的任务
allprojects {
    tasks.create('hello') {
        doLast {
            task ->
            println "project name is $task.project.name"
        }
    }
}

// 对所有子项目配置 'hello' 任务的额外行为
subprojects {
    hello.doLast {
        task ->
        println "here is subprojects $task.project.name"
    }
}

// 拓展:单独为一个子项目配置任务
project(':subject01') { // 注意这里是字符串加冒号的语法来指定子项目
    tasks.create('subject01') {
        doLast {
            println 'for subject01'
        }
    }
}

拓展说明

  1. 根项目配置:如果你在根项目的构建脚本中直接配置repositoriesdependencies,则这些配置只对根项目有效。

  2. 单独项目配置:你可以使用project('子项目路径')来单独为一个子项目配置任务或其他构建设置。

执行测试:

要查看测试效果,你可以在终端或命令行中运行gradle build指令。这将触发所有项目的构建过程,并执行你在allprojectssubprojects中定义的任务。

注意事项

  • allprojectssubprojects中定义的任务是惰性配置的,意味着它们只在实际执行时才会被创建。
  • 使用project('子项目路径')时,需要确保路径正确,并且该子项目已经在你的多项目构建中被定义。
  • 过度使用allprojectssubprojects可能会使构建配置变得难以管理,因此建议只在真正需要统一配置时使用。

4、ext 用户自定义属性

在Gradle中,ext(extension)属性允许用户在Project和Task对象中定义自定义属性。这些属性可以在构建脚本中读取和设置,也可以通过代码块一次性定义多个属性。

示例

// 自定义一个Project的属性
ext.age = 18

// 通过代码块同时自定义多个属性
ext {
    phone = 110
    address = "警察局"
}

// 在task中自定义属性
task extCustomProperty {
    // 使用ext代码块在task中定义自定义属性
    ext {
        desc = "奥利给"
    }
    doLast {
        println "年龄是:${age}"
        println "电话是:${phone}"
        println "地址是:${address}"
        println "阿杰:${desc}"
    }
}

测试

要测试自定义属性,可以在命令行中运行:

gradle extCustomProperty

输出结果将为:

年龄是:18
电话是:110
地址是:警察局
阿杰:奥利给

拓展 1: gradle.properties 配置:

gradle.properties 文件用于定义系统属性、环境变量、项目属性和JVM相关配置。这些属性在项目运行时自动加载,可以用来调整Gradle的行为和性能。

示例

# 设置JVM参数以避免内存溢出
org.gradle.jvmargs=-Xms4096m -Xmx8192m

# 开启Gradle缓存
org.gradle.caching=true

# 开启并行编译
org.gradle.parallel=true

# 启用新的孵化模式
org.gradle.configureondemand=true

# 开启守护进程
org.gradle.daemon=true

更多关于Gradle配置属性的信息,可以参考官方文档:

  • Configuring the Build Environment

5、Buildscript

buildscript块用于定义Gradle构建过程中所需的依赖,这些依赖通常是一些插件或库,它们对于执行构建脚本是必要的。buildscript必须位于build.gradle文件的最前端。

示例

import org.apache.commons.codec.binary.Base64

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // 添加commons-codec库到构建脚本的类路径
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
    }
}

// 注册一个名为'encode'的任务
tasks.register('encode') {
    doLast {
        // 使用Base64编码hello world字符串
        def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
        println new String(encodedString)
    }
}

注意事项

  1. 位置buildscript{}必须位于build.gradle文件的最前端。
  2. 多项目构建:在多项目构建中,根项目的buildscript()声明的依赖关系可用于其所有子项目的构建脚本。
  3. Gradle插件:构建脚本依赖也可能是Gradle插件,它们可以提供额外的构建功能。

插件应用示例

buildscript {
    ext {
        springBootVersion = "2.3.3.RELEASE"
    }
    repositories {
        mavenLocal()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
        jcenter()
    }
    // 添加Spring Boot插件到构建脚本的类路径
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

// 应用核心Java插件
apply plugin: 'java'
// 应用Spring Boot插件
apply plugin: 'org.springframework.boot'

在这个示例中,我们首先定义了一个扩展属性springBootVersion,然后在buildscriptdependencies块中使用这个属性来指定Spring Boot插件的版本。接着,我们通过apply plugin语句应用了Java核心插件和Spring Boot插件。

拓展

  • 仓库服务:您提供的链接指向了阿里云的Maven仓库服务,这是一个私有Maven制品仓库,可以用于存储和管理制品,如二进制库和插件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数? 1、open函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、open函数的常见应用场…

LLaMA详细解读

LLaMA 是目前为止,效果最好的开源 LLM 之一。精读 LLaMA 的论文及代码,可以很好的了解 LLM 的内部原理。本文对 LLaMA 论文进行了介绍,同时附上了关键部分的代码,并对代码做了注释。 摘要 LLaMA是一个系列模型,模型参…

带权并查集

续前章节:并查集及应用 目录 1 带权问题1.1 点带权1.2 边带权 2 例题2.1 家族合并2.2 信息传递2.3 [NOI2002] 银河英雄传说 1 带权问题 1.1 点带权 用num[i]记录节点 i i i 所在的集合的数量。 初始化:所有的num[i]都是 1 1 1,因为每个点…

公考学习|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

Spring 原理

🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 Bean的作用域 代码实现 观察Bean的作用域 Bean的生命周期 Spring …

[单片机课设]十字路口交通灯的设计

题目要求: 模拟交通灯运行情况。南北绿灯亮30秒,南北黄灯亮3秒,东西红灯亮33秒;南北红灯亮33秒,东西绿灯亮30秒,东西黄灯亮3秒;要求数码管同步显示时间的倒计时,用定时器实现延时。…

Java_从入门到JavaEE_07

一、数组的排序(冒泡排序) 原理: 从下标“0”开始,相邻两个元素依次进行比较,每次找出最大的往后移动。 规律:N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时,报如上图所示错误,其中一条是: ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

MongoDB详解

目录 一、MongoDB概述 1.MongoDB定义 2.MongoDB主要特点 2.1文档 2.2集合 2.3数据库 2.4数据模型 二、安装MongoDB 1.Windows安装MongoDB 1.1下载MongoDB 1.2安装MongoDB 1.3配置MongoDB 1.3.1可能遇到的问题 1.4安装一盒可视化工具 2.Linux安装MongoDB 2.1下载…

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言,鸿蒙内核有6个汇编文件,读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…

WPF之XmlDataProvider使用

1,WPF XAML支持数据提供(DataProvider),但其提供的数据只供查看不可进行修改,删除,添加等。 数据提供者都继承自System.Windows.DataSourceProvider类,目前,WPF只提供两个数据提供者…

Stream流操作

看到Stream流这个概念,我们很容易将其于IO流联系在一起,事实上,两者并没有什么关系,IO流是用于处理数据传输的,而Stream流则是用于操作集合的。 当然,为了方便我们区分,我们依旧在这里复习一下…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏:【机器学习:项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月5日,星期日

每天一分钟,知晓天下事! 2024年5月5日 星期日 农历三月廿七 立夏 1、 近日国际金价大幅震荡,跌至近一个月新低。 2、 2024亚洲少年攀岩锦标赛:中国选手包揽U14和U12速度赛男女组前三名。 3、 马来西亚将进一步优化中国游客入境程…

【详细教程】手把手教你开通YouTube官方API接口(youtube data api v3)

文章目录 一、背景调查1.1 youtube介绍1.2 分析价值与意义1.3 API接口介绍 二、申请接口权限2.1、注册Google账号2.2、创建项目2.3、启用youtube data api v3服务2.4、创建凭据 三、后续发布 一、背景调查 1.1 youtube介绍 众所周知,youtube是目前全球最大的视频社…

MyCat安装配置,及数据分片

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Python深度学习基于Tensorflow(1)Numpy基础

numpy的重要性不言而喻,一般不涉及到GPU/TPU计算,都是用numpy,常见的np就是这个玩意。其特点就是快!其实如果不涉及到深度学习,还有一个库是很重要的,scipy,集成了很多的东西。 安装和导入如下…

002-ChatGLM4接入Langchain

智谱AI GLM-4 新一代基座大模型GLM-4,整体性能相比GLM3全面提升60%,逼近GPT-4;支持更长上下文;更强的多模态;支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体能力。 基础能力(英文):GLM-4 在 MMLU、GSM8K、MATH、BBH、HellaSwag、HumanEval等…

[云原生]Docker-compose:一站式多容器应用部署神器

目录 引言 一、Docker Compose 简介 (一)基本信息 (二)核心特性 (三)文件格式 二、Docker Compose 环境安装 (一)准备安装包 (二)添加执行权限 三、…

[Meachines][Hard]Napper

Main $ nmap -p- -sC -sV 10.10.11.240 --min-rate 1000 $ curl http://10.10.11.240 $ gobuster dir -u "https://app.napper.htb" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -k 博客 $ ffuf -c -w /usr/share/se…