概述
? Gradle 是一种开源构建自动化工具,其设计足够灵活,几乎可以构建任何类型的软件。以下是其一些最重要功能的高级概述:
高性能
? Gradle 通过只运行需要运行的任务来避免不必要的工作,因为它们的输入或输出发生了变化。您还可以使用构建缓存来重用来自先前运行或什至来自不同机器(具有共享构建缓存)的任务输出。
JVM基础
? Gradle 在 JVM 上运行,您必须安装 Java 开发工具包 (JDK ) 才能使用它。这对于熟悉 Java 平台的用户来说是一个好处,因为您可以在构建逻辑中使用标准 Java API ,例如自定义任务类型和插件。它还可以轻松地在不同平台上运行 Gradle 。
公约
? Gradle 借鉴了 Maven 的书,并通过实现约定使常见类型的项目(例如 Java 项目)易于构建。应用适当的插件,您可以轻松地为许多项目创建精简的构建脚本。但是这些约定并不限制您:Gradle 允许您覆盖它们,添加您自己的任务,并对基于约定的构建进行许多其他自定义。
可扩展性
? 可以轻松扩展 Gradle 以提供您自己的任务类型甚至构建模型。
IDE 支持
? 几个主要的 IDE 允许导入 Gradle 构建并与之交互。
洞察力
? 构建扫描提供有关构建运行的大量信息,您可以使用这些信息来识别构建问题。它们特别擅长帮助您识别构建性能的问题。您还可以与他人共享构建扫描,这在您需要寻求建议以解决构建问题时特别有用。
安装
针对 gradle 下载 jar 包很慢进行配置
- 只对当前项目进行配置,找到对应工程的
build.gradle 将拉去jar 包的镜像地址换成阿里云的仓库。
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral()
}
- 配置全局的配置,在
C:\Users\用户\.gradle 这个文件夹下新建 init.gradle 文件,加上以下配置
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
使用 Gradle 编译工程是控制台输出报错内容,中文乱码
- 编辑
Help > Edit Custom VM Options 增加 -Dfile.encoding=UTF-8 ,增加后重启IDEA 生效
Gradle 创建多个项目依赖
Gradle 中的多项目构建由一个根项目和一个或多个子项目组成。
项目布局
------------------------------------------------------------
Root project 'gradle-project'
------------------------------------------------------------
Root project 'gradle-project'
+--- Project ':gradle-project-one'
+--- Project ':gradle-project-three'
\--- Project ':gradle-project-two'
- 请注意,根项目没有
Gradle 构建文件,只有定义要包含的子项目的设置文件。
rootProject.name = 'gradle-project'
include 'gradle-project-one'
include 'gradle-project-two'
include 'gradle-project-three'
Gradle 中 api、implementation 和 compile 的区别
- 在 3.0 后,废弃了 compile,使用
implementation 和 api 来代替。api 等同于 compile ,意思是:我会把你暴露给第三方。implementation 意思是:我不会把你暴露给第三方。 - 举个简单的例子:
DemoOne 依赖DemoTwo ,DemoTwo 依赖DemoThree 。如果使用compile 那么DemoOne 能直接访问DemoThree 中的类,使用implementation 无法访问到DemoThree 中的类。
构建时候常见报错
高版本不支持低版本的语法
Could not find method testCompile() for arguments [{group=junit, name=junit, version=4.12}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDepende
ncyHandler.
- 类似于这样的报错都是因为版本问题,换个其它命令就可以了。解决方法如下:
dependencies {
testImplementation group: 'junit', name: 'junit', version: "${junitVersion}"
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.5.5'
}
Https和http 引起的错误
Could not resolve all dependencies for configuration ':demo2-mu1:compileClasspath'.
Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven(http://127.0.0.1:8081/repository/maven-public)' to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See https://docs.gradle.org/7.1/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol for more details.
指定是否可以通过不安全的 HTTP 连接与存储库进行通信。
出于安全目的,这有意要求用户根据具体情况选择使用不安全的协议。
Gradle 故意不提供允许普遍禁用此检查的全局系统/gradle 属性。
允许通过不安全协议进行通信允许中间人冒充目标服务器,并使攻击者能够 在系统上提供恶意可执行代码。
repositories {
maven{
allowInsecureProtocol = true
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
或者是将仓库的链接换成Https
repositories {
maven{
url 'https://maven.aliyun.com/nexus/content/groups/public/'
}
}
Gradle父子工程
父工程配置
ext {
junitVersion = '5.8.1'
springbootVersion = '2.5.5'
springbootTestVersion = '2.5.5'
}
allprojects {
group 'com.li.demo'
version '1.0-SNAPSHOT'
apply plugin: 'maven'
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral()
}
}
subprojects {
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
dependencies {
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springbootVersion
testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springbootTestVersion
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junitVersion
}
}
子工程配置
dependencies {
implementation project(":gradle-project-two")
}
|