经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » Gradle » 查看文章
Gradle的基本使用
来源:jb51  时间:2021/3/1 17:18:21  对本文有异议

一、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. repositories {
  2. mavenLocal()
  3. 'maven(http://maven.aliyun.com/nexus/content/groups/public/)'
  4. mavenCentral()
  5. }

更推荐的方式是类似的Maven的settings.xml全局的配置,在上一步配置的GRADLE_USER_HOME路径下,添加init.gradle文件,以下配置文件中使用了阿里云的Gradle代理,支持jcenter、google、maven仓库。

  1. gradle.projectsLoaded {
  2. rootProject.allprojects {
  3. buildscript {
  4. repositories {
  5. def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
  6. def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
  7. def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
  8. all { ArtifactRepository repo ->
  9. if (repo instanceof MavenArtifactRepository) {
  10. def url = repo.url.toString()
  11. if (url.startsWith('https://jcenter.bintray.com/')) {
  12. project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
  13. println("buildscript ${repo.url} replaced by $JCENTER_URL.")
  14. remove repo
  15. }
  16. else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
  17. project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
  18. println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
  19. remove repo
  20. }
  21. else if (url.startsWith('https://repo1.maven.org/maven2')) {
  22. project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
  23. println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
  24. remove repo
  25. }
  26. }
  27. }
  28. jcenter {
  29. url JCENTER_URL
  30. }
  31. google {
  32. url GOOGLE_URL
  33. }
  34. maven {
  35. url NEXUS_URL
  36. }
  37. }
  38. }
  39. repositories {
  40. def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
  41. def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
  42. def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
  43. all { ArtifactRepository repo ->
  44. if (repo instanceof MavenArtifactRepository) {
  45. def url = repo.url.toString()
  46. if (url.startsWith('https://jcenter.bintray.com/')) {
  47. project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
  48. println("buildscript ${repo.url} replaced by $JCENTER_URL.")
  49. remove repo
  50. }
  51. else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
  52. project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
  53. println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
  54. remove repo
  55. }
  56. else if (url.startsWith('https://repo1.maven.org/maven2')) {
  57. project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
  58. println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
  59. remove repo
  60. }
  61. }
  62. }
  63. jcenter {
  64. url JCENTER_URL
  65. }
  66. google {
  67. url GOOGLE_URL
  68. }
  69. maven {
  70. url NEXUS_URL
  71. }
  72. }
  73. }
  74. }

三、最佳实践

  • 多模块配置

稍微大点的项目都会分模块开发,Gradle相比Maven的一个优势是用IDEA执行一个项目的代码时,会自动编译其依赖的其他模块。

在项目一级目录下添加settings.gradle配置文件:

  1. rootProject.name = 'my-roject-name'
  2.  
  3. include 'module1'
  4. include 'module2'

其中module1、module2就是子模块的文件夹名,在子模块里需要有一个配置子模块的build.gradle

模块内依赖,比如module2依赖module1,在module2的build.gradle配置文件里添加:

  1. dependencies {
  2. compile project(":module1")
  3. }
  • profile支持

profile用来加载不同环境的的配置文件,在笔者所在公司,推荐dev、test、staging、prod四套环境。

添加gradle.properties配置文件指定默认profile

  1. profile=dev

启动profile,加载不同路径下的配置,在build.gradle里添加配置:

  1. ext {
  2. profile = project['profile']
  3. }
  4. sourceSets {
  5. main {
  6. resources {
  7. srcDirs = ["src/main/resources/", "src/main/profiles/${profile}"]
  8. }
  9. }
  10. }

命令行参数指定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. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>${spring-boot.version}</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

Gradle有插件支持类似操作:

  1. //引入插件
  2. plugins {
  3. id "io.spring.dependency-management" version "1.0.10.RELEASE"
  4. }
  5. //引入bom
  6. dependencyManagement {
  7. imports {
  8. mavenBom 'org.springframework.boot:spring-boot-dependencies:${spring-boot.version}'
  9. }
  10. }
  11. //使用bom,不需要执行版本号
  12. dependencies {
  13. implementation "org.springframework.boot:spring-boot-starter-web"
  14. }
  • 引入parent文件

在maven中执行parent是管理多个项目常用的方式,parent指定了项目的基本配置,配置方式如下:

  1. <parent>
  2. <groupId>com.lesofn.blog</groupId>
  3. <artifactId>test-parent</artifactId>
  4. <version>0.0.1</version>
  5. </parent>

Maven中的parent有两个作用,一个是类似bom的统一管理版本,即parent中的:dependencyManagement,另一个是基础jar包的引用,即父pom中的:dependencies

在Gradle可通过上面的io.spring.dependency-management插件实现类似的效果:

  1. //引入插件
  2. plugins {
  3. id "io.spring.dependency-management" version "1.0.10.RELEASE"
  4. }
  5. //引入parent,实现maven中dependencyManagement的功能,不用指定版本号
  6. dependencyManagement {
  7. imports {
  8. mavenBom 'com.lesofn.blog:test-parent:0.0.1'
  9. }
  10. }
  11. //再次引入parent,实现maven中dependencies的功能
  12. dependencies {
  13. implementation 'com.lesofn.blog:test-parent:0.0.1'
  14. }

四、总结

经过以上配置,基本覆盖了Gradle开发过程中的大部分问题,如果还有什么问题,欢迎留言讨论。

以上就是Gradle的基本使用的详细内容,更多关于Gradle 使用的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号