# Gradle 在开发中的使用
Posted MarlonBrando1998
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# Gradle 在开发中的使用相关的知识,希望对你有一定的参考价值。
概述
Gradle
是一种开源构建自动化工具,其设计足够灵活,几乎可以构建任何类型的软件。以下是其一些最重要功能的高级概述:
高性能
Gradle
通过只运行需要运行的任务来避免不必要的工作,因为它们的输入或输出发生了变化。您还可以使用构建缓存来重用来自先前运行或什至来自不同机器(具有共享构建缓存)的任务输出。
JVM基础
Gradle
在 JVM
上运行,您必须安装 Java
开发工具包 (JDK
) 才能使用它。这对于熟悉 Java
平台的用户来说是一个好处,因为您可以在构建逻辑中使用标准 Java API
,例如自定义任务类型和插件。它还可以轻松地在不同平台上运行 Gradle
。
公约
Gradle
借鉴了 Maven
的书,并通过实现约定使常见类型的项目(例如 Java 项目)易于构建。应用适当的插件,您可以轻松地为许多项目创建精简的构建脚本。但是这些约定并不限制您:Gradle 允许您覆盖它们,添加您自己的任务,并对基于约定的构建进行许多其他自定义。
可扩展性
可以轻松扩展 Gradle
以提供您自己的任务类型甚至构建模型。
IDE
支持
几个主要的 IDE
允许导入 Gradle
构建并与之交互。
洞察力
构建扫描提供有关构建运行的大量信息,您可以使用这些信息来识别构建问题。它们特别擅长帮助您识别构建性能的问题。您还可以与他人共享构建扫描,这在您需要寻求建议以解决构建问题时特别有用。
安装
-
Gradle
可在所有主要操作系统上运行,并且只需要Java 8
或更高版本即可运行。 -
Gradle
附带了自己的Groovy
库,因此不需要安装Groovy
。Gradle
会忽略任何现有的Groovy
安装。 -
Gradle
使用它在路径中找到的任何JDK
。 -
下载
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 {
// testCompile group: 'junit', name: 'junit', version:"${junitVersion}"
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.
Gradle
官网错误描述
指定是否可以通过不安全的 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'
// 让Gradle自动生成Intellij的项目文件
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 {
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springbootVersion
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test
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")
}
以上是关于# Gradle 在开发中的使用的主要内容,如果未能解决你的问题,请参考以下文章