【Gradle】简单入门

参考环境

gradle 6.5.1 + jdk8

下载

https://gradle.org/next-steps/?version=6.5.1&format=bin

配置环境变量(略)

配置国内镜像

  • 单个项目有效

    build.gradle

    repositories {
    //    mavenCentral()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    }
    
  • 全部项目有效

    GRADLE_HOME/init.d/init.gradle

    allprojects{
     repositories {
      def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
      def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
      def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
      def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
      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
        }
        if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
         project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
         remove repo
        }
        if (url.startsWith('https://plugins.gradle.org/m2/')) {
         project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
         remove repo
        }
       }
      }
      maven { url ALIYUN_REPOSITORY_URL }
      maven { url ALIYUN_JCENTER_URL }
      maven { url ALIYUN_GOOGLE_URL }
      maven { url ALIYUN_GRADLE_PLUGIN_URL }
     }
    }
    

gradle项目结构

整体结构图

├── gradle 
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew 
├── gradlew.bat 
├── settings.gradle 
├── buildSrc
│   ├── build.gradle 
│   └── src
│       └── main
│           └── groovy 
│               ├── demo.java-application-conventions.gradle
│               ├── demo.java-common-conventions.gradle
│               └── demo.java-library-conventions.gradle
├── app
│   ├── build.gradle 
│   └── src
│       ├── main 
│       │   └── java
│       │       └── demo
│       │           └── app
│       │               ├── App.java
│       │               └── MessageUtils.java
│       └── test 
│           └── java
│               └── demo
│                   └── app
│                       └── MessageUtilsTest.java
├── list
│   ├── build.gradle 
│   └── src
│       ├── main 
│       │   └── java
│       │       └── demo
│       │           └── list
│       │               └── LinkedList.java
│       └── test 
│           └── java
│               └── demo
│                   └── list
│                       └── LinkedListTest.java
└── utilities
    ├── build.gradle 
    └── src
        └── main 
            └── java
                └── demo
                    └── utilities
                        ├── JoinUtils.java
                        ├── SplitUtils.java
                        └── StringUtils.java

项目有关文件

settings.gradle

//项目名称
rootProject.name = 'demo'
// 多个模块名称
include('app', 'list', 'utilities')

多个子项目共享构建逻辑和配置,使用约定插件buildSrc

buildSrc / src / main / groovy / demo.java-common-conventions.gradle
plugins {
// java插件,构建java项目的所有功能
    id 'java' 
}

repositories {
    //存储库-外部依赖项的源
    jcenter() 
    
}
//标准依赖项
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2' 

    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' 
}

tasks.named('test') {
    useJUnitPlatform() 
}
buildSrc / src / main / groovy / demo.java-library-conventions.gradle
plugins {
    id 'demo.java-common-conventions' 

    id 'java-library' 
}
buildSrc / src / main / groovy / demo.java-application-conventions.gradle
plugins {
    id 'demo.java-common-conventions' 

    id 'application' 
}

子项目中的构建文件

app / build.gradle
plugins {
    id 'demo.java-application-conventions'
}

dependencies {
    implementation project(':utilities')
}

application {
    mainClass = 'demo.app.App' 
}
list / build.gradle
plugins {
    id 'demo.java-library-conventions'
}
utilities/ build.gradle
plugins {
    id 'demo.java-library-conventions'
}

dependencies {
    api project(':list')
}

包含3块

  • 每个脚本都包含1个plugins{}块来应用插件。

  • 依赖关系:dependencies {}

    依赖关系可以是外部的

    也可以是子项目的,使用project(...)

  • 一个或多个配置块,如application{}

build.gradle

buildSrc / build.gradle
plugins {
    id 'groovy-gradle-plugin' 
}

repositories {
    gradlePluginPortal() 
}

调用方式

命令行

初始化

image-20201226195354561

运行tests

详情报告地址:/build/reports

执行全部模块的tests。

./gradlew  check

指定模块的test

./gradlew  :App:check

运行应用

执行mainClass指定的main方法

./gradlew  run

备注:第一次执行打包脚本gradlew 会下载gradle版本到本地的~/.gradle/wrapper/dists,会有点延迟。

打包应用

包含命令行脚本和相关的依赖。

./gradlew build

生成的结果为:app/build/distributions/app.tarandapp/build/distributions/app.zip

发布Build Scan

./gradlew build --scan

会发布到https://scans.gradle.com/,浏览器查看详build详情。

IDE(idea)

配置

方式1:单独指定安装的gradle环境位置。

image-20201227144959685

方式2:IDEA默认就会使用gradle wrapper来创建项目,所以无需安装gradle也可以正常运行。

image-20201227151111611

image-20201227151148461

gradle vs maven

  • 更灵活:gradle与maven都提供了约定配置,但是maven比较僵化,gradle更灵活。maven是xml,gradle的.gradle文件本身是groovy脚本。

  • 高性能:gradle构建时间更短。

    增量构建(处理更改的文件);Build Cache(缓存构建的结果);Gradle Daemon(守护线程随时将构建信息热存储在内存)。

    备注:gradle至少比maven快1倍,使用build Cache有可能快100倍。

  • 用户体验好:随时更新

    命令行工具:https://github.com/gradle/gradle-completion

    基于Web的UI工具(也可以支持maven):https://scans.gradle.com/

  • 依赖管理

    maven的scope:compile(默认)、provided、test、runtime

    gradle的scope:

    • implementation(默认):编译和运行可见,但不会暴露在类库使用者的编译时。
    • api:跟implementation一样,编译和运行可见,但会暴露给类库使用者。
    • compileOnly和runtimeOnly:编译时可见和运行时可见。
    • testImplementation:测试编译和测试运行时可见。

总结

  1. gradle可以初始生成JAVA项目
  2. 支持多模块项目
  3. 支持多模块间共享配置,约定插件buildSrc(convention plugins
  4. 支持多项目执行同一个task,指定项目执行task
  5. 支持构建,bundle(打包),运行应用
posted @ 2021-01-04 12:01  牛蜗  阅读(419)  评论(0编辑  收藏  举报