使用Gradle,放弃Maven

使用Gradle,放弃Maven

  • 安装Gradle
  • 使用gradle wrapper安装
  • 依赖管理
  • gradle的任务和插件
  • 配置镜像

Gradle和Maven都是非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:

  1. Maven的配置文件是XML格式的,假如你的项目依赖的包比较多,那么XML文件就会变得非常非常长;
  2. XML文件不太灵活,假如你需要在构建过程中添加一些自定义逻辑,搞起来非常麻烦;
  3. Maven非常的稳定,但是相对的就是对新版java支持不足,哪怕就是为了编译java11,也需要更新内置的Maven插件。

如果你对Maven的这些缺点也有所感触,准备尝试其他的构建工具,那么你可以试试gradle,这是一个全新的java构建工具,解决了Maven的一些痛点。

使用Gradle,放弃Maven_第1张图片

安装Gradle

传统的安装方法就是去gradle官网下载二进制包,解压,然后将路径添加到环境变量中。下载地址https://gradle.org/next-steps/?version=6.5.1&format=bin

安装流程

下载安装包

使用Gradle,放弃Maven_第2张图片

配置GRADLE_HOME目录

使用Gradle,放弃Maven_第3张图片

配置path环境变量,保证在任何目录都能执行gradle名令

使用Gradle,放弃Maven_第4张图片

检查是否配置成功gradle -v

使用Gradle,放弃Maven_第5张图片

之前就听说过gradle,然后尝试使用它,结果因为速度太慢,最后放弃了。不过现在使用gradle的话会方便很多。gradle官方在中国开设了,CDN,使用gradle wrapper的时候下载速度非常快。可以说现在是一个学习使用gradle的好时候。

因为gradle是一个非常迭代更新比较快的项目,每隔几个月就会发布一个新版本,这种方式可能跟不上gradle的更新速度。gradle提供了一个名为gradle wrapper的工具,可以在没有安装gradle的情况下使用gradle。其实它就是个脚本文件,当你运行wrapper脚本的时候,如果脚本发现你电脑里没有gradle,就会自动替你下载安装一个。现在甚至还出现了Maven wrapper,也是个脚本文件,可以自动安装Maven。

使用gradle wrapper安装

IDEA默认就会使用gradle wrapper来创建项目,所以无需安装gradle也可以正常运行。这里我使用的IDEA来创建和使用gradle项目。我们直接使用初始化创建一个SpringBoot项目

使用Gradle,放弃Maven_第6张图片

这时候项目结构应该类似下图所示,使用Maven的我们应该比较熟悉,因为这和Maven的项目结构几乎完全一致。gradle文件夹和gradlew那几个文件就是gradle wrapper的文件,而.gradle后缀名的文件正是gradle的配置文件,对应于Mavenpom.xml

使用Gradle,放弃Maven_第7张图片

gradle wrapper的优点之一就是可以自定义下载的gradle的版本,如果是团队协作的话,这个功能就非常方便,简单设置即可统一团队的构建工具版本。这里我就设定成目前最新的gradle 6.4.1.默认下载安装的是bin版,仅包含二进制。如果你使用IDEA的话,它会推荐下载all版,包含源代码,这样IDEA就可以分析源代码,提供更加精确的gradle脚本支持。

使用Gradle,放弃Maven_第8张图片

依赖管理

gradle的依赖管理功能也算是我们使用构建工具的主要目的之一了。这点也是gradle相较maven的优势之一了。相较于maven一大串的XML配置,gradle的依赖项仅需一行。

// 定义依赖:声明项目中需要哪些依赖
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

这里推荐一下Jetbrains的Package Search | JetBrains网站,是寻找mavengradle依赖包的最佳网站,可以非常轻松的搜索和使用依赖项。以搜索junit为例,选择类型复制

使用Gradle,放弃Maven_第9张图片

使用Gradle,放弃Maven_第10张图片

gradle依赖的粒度控制相较于Maven也更加精细,maven只有compileprovidedtestruntime四种scope,而gradle有以下几种scope:

  1. implementation,默认的scope。implementation的作用域会让依赖在编译和运行时均包含在内,但是不会暴露在类库使用者的编译时。举例,如果我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖。
  2. api,和implementation类似,都是编译和运行时都可见的依赖。但是api允许我们将自己类库的依赖暴露给我们类库的使用者。
  3. compileOnlyruntimeOnly,这两种顾名思义,一种只在编译时可见,一种只在运行时可见。而runtimeOnly和Maven的provided比较接近。
  4. testImplementation,这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。
  5. testCompileOnlytestRuntimeOnly,这两种类似于compileOnly和runtimeOnly,但是作用于测试编译时和运行时。

通过简短精悍的依赖配置和多种多样的作用与选择,Gradle可以为我们提供比Maven更加优秀的依赖管理功能。

gradle的任务和插件

使用Gradle,放弃Maven_第11张图片

gradle的配置文件是一个groovy脚本文件,在其中我们可以以编程方式自定义一些构建任务。因为使用了编程方式,所以这带给了我们极大的灵活性和便捷性。打个比方,现在有个需求,要在打包出jar的时候顺便看看jar文件的大小。在gradle中仅需在构建脚本中编写几行代码即可。而在Maven中则需要编写Maven插件,复杂程度完全不在一个水平。

当然,Maven发展到现在,已经存在了大量的插件,提供了各式各样的功能可以使用。但是在灵活性方面还是无法和Gradle相比。而且Gradle也有插件功能,现在发展也十分迅猛,存在了大量非常好用的插件,例如gretty插件。gretty原来是社区插件,后来被官方吸收为官方插件,可以在Tomcat和jetty服务器上运行web项目,比Maven的相关插件功能都强大。

虽然gradle可以非常灵活的编写自定义脚本任务,但是其实一般情况下我们不需要编写构建脚本,利用现有的插件和任务即可完成相关功能。在IDEA里,也可以轻松的查看当前gradle项目中有多少任务,基本任务如build、test等Maven和Gradle都是相通的。

配置镜像

Maven官方仓库的下载速度非常慢,所以一般我们要配置国内的镜像源。gradle在这方面和Maven完全兼容,因此只需稍微配置一下镜像源,即可使用Maven的镜像。如果你用gradle构建过项目,应该就可以在用户目录的.gradle文件夹下看到gradle的相关配置和缓存。之前wrapper下载的gradle也存放在该文件夹下,位置是wrapper/dists。而依赖的本地缓存在caches\modules-2\files-2.1文件夹下。目录结构和Maven的本地缓存类似,都是包名+版本号的方式,但是gradle的目录结构最后一层和Maven不同,这导致它们无法共用本地缓存。

IDEA中可以修改该目录

使用Gradle,放弃Maven_第12张图片

gradle中配置下载镜像需要在你在idea中修改gradle文件夹目录中(我的是G:/gradle/gradle-6.5/gradleRep)直接新建一个init.gradle全局初始化脚本,脚本文件内容如下。这样一来,gradle下载镜像的时候就会使用这里配置的镜像源下载,速度会快很多。再加上gradle wrapper在中国设置了CDN,现在使用gradle的速度应该会很快。

allprojects {
   repositories {
       maven {
           url "https://maven.aliyun.com/repository/public"
       }
       maven {
           url "https://maven.aliyun.com/repository/jcenter"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/gradle-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/google"
       }
       maven {
           url "https://maven.aliyun.com/repository/grails-core"
       }
       maven {
           url "https://maven.aliyun.com/repository/apache-snapshots"
       }
   }
}

你可能感兴趣的:(#,代码依赖管理,gradle)