Gradle的基本使用
一、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
repositories { mavenlocal() 'maven(http://maven.aliyun.com/nexus/content/groups/public/)' mavencentral() }
更推荐的方式是类似的maven的settings.xml全局的配置,在上一步配置的gradle_user_home路径下,添加init.gradle文件,以下配置文件中使用了阿里云的gradle代理,支持jcenter、google、maven仓库。
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配置文件:
rootproject.name = 'my-roject-name' include 'module1' include 'module2'
其中module1、module2就是子模块的文件夹名,在子模块里需要有一个配置子模块的build.gradle
模块内依赖,比如module2依赖module1,在module2的build.gradle配置文件里添加:
dependencies { compile project(":module1") }
- profile支持
profile用来加载不同环境的的配置文件,在笔者所在公司,推荐dev、test、staging、prod四套环境。
添加gradle.properties配置文件指定默认profile
profile=dev
启动profile,加载不同路径下的配置,在build.gradle里添加配置:
ext { profile = project['profile'] } sourcesets { main { resources { srcdirs = ["src/main/resources/", "src/main/profiles/${profile}"] } } }
命令行参数指定profile:
gradle build -pprofile=prod
- 初始化gradle项目
安装gradle,并在项目*目录下执行:
gradle init
如果当前目录有pom.xml,接下来会提示是否从maven项目初始化gradle项目,选择yes回车执行。
参数文档:
- 引入bom文件
pom文件在maven中是一个很有用的功能,方便多个项目统一版本号,在maven中配置方式如下:
<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有插件支持类似操作:
//引入插件 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指定了项目的基本配置,配置方式如下:
<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插件实现类似的效果:
//引入插件 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 使用的资料请关注其它相关文章!
下一篇: BZOJ3277: 串(广义后缀自动机)