一、Gradle相比Maven的优势
- 配置简洁
Maven是用pom.xml管理,引入一个jar包至少5行代码,Gradle只需要一行。
- 构建速度快
Gradle支持daemon方式运行,启动速度快,同时有基于daemon的增量构建,充分利用JVM的运行时优化,和缓存数据构建速度相比Maven快很多。
- 更好的灵活性、扩展性
Gradle 相对于 Maven 等构建工具, 其提供了一系列的 API 让我们有能力去修改或定制项目的构建过程。
二、基本配置
- 设置本地仓库地址
默认本地仓库地址是:~/.gradle,Windows下会占用大量C盘空间。
设置环境变量,GRADLE_USER_HOME=/your/path
- 复用Maven本地仓库
在repositories配置mavenLocal()即可,如果是init.gradle全局配置,参考以下init.gradle文件
Maven本地仓库查找路径:
(1)USER_HOME/.m2/settings.xml
(2)M2_HOME/conf/settings.xml
(3)USER_HOME/.m2/repository
- 国内镜像加速
国内访问国外仓库地址很慢,第一种方法是在每个项目中设置repositories
1
2
3
4
5
|
repositories {
mavenLocal()
'maven(http://maven.aliyun.com/nexus/content/groups/public/)'
mavenCentral()
}
|
更推荐的方式是类似的Maven的settings.xml全局的配置,在上一步配置的GRADLE_USER_HOME路径下,添加init.gradle文件,以下配置文件中使用了阿里云的Gradle代理,支持jcenter、google、maven仓库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_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://jcenter.bintray.com/' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println( "buildscript ${repo.url} replaced by $JCENTER_URL." )
remove repo
}
else if (url.startsWith( 'https://dl.google.com/dl/android/maven2/' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println( "buildscript ${repo.url} replaced by $GOOGLE_URL." )
remove repo
}
else if (url.startsWith( 'https://repo1.maven.org/maven2' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println( "buildscript ${repo.url} replaced by $REPOSITORY_URL." )
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_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://jcenter.bintray.com/' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println( "buildscript ${repo.url} replaced by $JCENTER_URL." )
remove repo
}
else if (url.startsWith( 'https://dl.google.com/dl/android/maven2/' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println( "buildscript ${repo.url} replaced by $GOOGLE_URL." )
remove repo
}
else if (url.startsWith( 'https://repo1.maven.org/maven2' )) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println( "buildscript ${repo.url} replaced by $REPOSITORY_URL." )
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
}
|
三、最佳实践
- 多模块配置
稍微大点的项目都会分模块开发,Gradle相比Maven的一个优势是用IDEA执行一个项目的代码时,会自动编译其依赖的其他模块。
在项目一级目录下添加settings.gradle配置文件:
1
2
3
4
|
rootProject.name = 'my-roject-name'
include 'module1'
include 'module2'
|
其中module1、module2就是子模块的文件夹名,在子模块里需要有一个配置子模块的build.gradle
模块内依赖,比如module2依赖module1,在module2的build.gradle配置文件里添加:
1
2
3
|
dependencies {
compile project( ":module1" )
}
|
- profile支持
profile用来加载不同环境的的配置文件,在笔者所在公司,推荐dev、test、staging、prod四套环境。
添加gradle.properties配置文件指定默认profile
1
|
profile=dev
|
启动profile,加载不同路径下的配置,在build.gradle里添加配置:
1
2
3
4
5
6
7
8
9
10
|
ext {
profile = project[ 'profile' ]
}
sourceSets {
main {
resources {
srcDirs = [ "src/main/resources/" , "src/main/profiles/${profile}" ]
}
}
}
|
命令行参数指定profile:
1
|
gradle build -Pprofile=prod
|
- 初始化gradle项目
安装gradle,并在项目*目录下执行:
1
|
gradle init
|
如果当前目录有pom.xml,接下来会提示是否从Maven项目初始化Gradle项目,选择yes回车执行。
参数文档:https://docs.gradle.org/current/userguide/build_init_plugin.html
- 引入bom文件
pom文件在Maven中是一个很有用的功能,方便多个项目统一版本号,在Maven中配置方式如下:
1
2
3
4
5
6
7
8
9
10
11
|
< dependencyManagement >
< dependencies >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-dependencies</ artifactId >
< version >${spring-boot.version}</ version >
< type >pom</ type >
< scope >import</ scope >
</ dependency >
</ dependencies >
</ dependencyManagement >
|
Gradle有插件支持类似操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//引入插件
plugins {
id "io.spring.dependency-management" version "1.0.10.RELEASE"
}
//引入bom
dependencyManagement {
imports {
mavenBom 'org.springframework.boot:spring-boot-dependencies:${spring-boot.version}'
}
}
//使用bom,不需要执行版本号
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web"
}
|
- 引入parent文件
在maven中执行parent是管理多个项目常用的方式,parent指定了项目的基本配置,配置方式如下:
1
2
3
4
5
|
< parent >
< groupId >com.lesofn.blog</ groupId >
< artifactId >test-parent</ artifactId >
< version >0.0.1</ version >
</ parent >
|
Maven中的parent有两个作用,一个是类似bom的统一管理版本,即parent中的:dependencyManagement,另一个是基础jar包的引用,即父pom中的:dependencies
在Gradle可通过上面的io.spring.dependency-management插件实现类似的效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//引入插件
plugins {
id "io.spring.dependency-management" version "1.0.10.RELEASE"
}
//引入parent,实现maven中dependencyManagement的功能,不用指定版本号
dependencyManagement {
imports {
mavenBom 'com.lesofn.blog:test-parent:0.0.1'
}
}
//再次引入parent,实现maven中dependencies的功能
dependencies {
implementation 'com.lesofn.blog:test-parent:0.0.1'
}
|
四、总结
经过以上配置,基本覆盖了Gradle开发过程中的大部分问题,如果还有什么问题,欢迎留言讨论。
以上就是Gradle的基本使用的详细内容,更多关于Gradle 使用的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/lesofn/p/14270731.html