zoukankan      html  css  js  c++  java
  • 【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(打包),运行应用
  • 相关阅读:
    LDAP 总结
    关于OpenLDAPAdmin管理页面提示“This base cannot be created with PLA“问题. Strong Authentication Required问题
    PHP 7.0 5.6 下安裝 phpLDAPadmin 发生错误的修正方法
    ldap、additional info: no global superior knowledge
    ldap安装配置过程中遇到的错误,以及解决方法
    转: LDAP有啥子用? 用户认证
    Mac 安装 brew
    go test 单元函数测试
    haproxy httpcheck with basic auth
    architecture and business process modelling
  • 原文地址:https://www.cnblogs.com/stxyg/p/14229020.html
Copyright © 2011-2022 走看看