0 起因

最近公司要求,新的项目要用gradle来代替maven来构建项目,自己也踩了很多坑,分享一下。

本次gradle的版本为7.x

1 gradle-wrapper

Gradle Wrapper(以下简写为“Wrapper”)用于管理当前项目的Gradle版本,Gradle官方强烈推荐使用Wrapper构建项目。多人协作时,必须规定项目的Gradle版本,并以此版本的Gradle作为项目的构建工具,由于每个人在本地安装的Gradle版本可能并不一致(也没有必要一致),因此有必要在项目中统一管理Gradle版本。

1.1 引入

  1. 使用gradle init创建新项目,则会初始化一个带有Wrapper的Gradle项目。
  2. 使用gradle wrapper在旧的项目中添加Wrapper。
  3. idea自动添加。(本次gradle完全使用idea管理的gradle

2 目录结构

2.1 单模块

├── build.gradle                     			# 描述子项目的依赖和构建等信息,类似于pom
├── settings.gradle   										# 描述根目录和子项目的关键信息
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar  					  # 一个很轻量的可执行jar,用于下载Gradle
│       └── gradle-wrapper.properties  			# 描述gradle版本和下载相关配置
├── gradlew     # Wrapper的shell script  	 # Wrapper的shell script
└── gradlew.bat                             # Wrapper的cmd script

2.2 多模块

├─build.gradle            # 描述根项目的依赖和构建的核心文件
├─settings.gradle         # 描述根目录和子项目的关键信息
├─gradlew                 # Wrapper的shell script
├─gradle.bat              # Wrapper的cmd script
├─application-api
│  ├─build.gradle         # 描述子项目的依赖和构建等信息
│  └─src
│      └─main
│         └─java
│            └─com.example.x
├─application-boot
│  ├─build.gradle         # 描述子项目的依赖和构建等信息
│  └─src
│      ├─main
│      │  ├─java
│      │  │  └─com.example.x
│      │  └─resources
│      └─test
│          └─java
│             └─com.example.x
├─application-core
│  ├─build.gradle         # 描述子项目的依赖和构建等信息
│  └─src
│      └─main
│         └─java
│            └─com.example.x
└─gradle
    └─wrapper
         ├─gradle-wrapper.jar         # 一个很轻量的可执行jar,用于下载Gradle
         └─gradle-wrapper.properties  # 描述gradle版本和下载相关配置

2.3 执行gramlin命令

在项目的根目录下执行gradlew命令来代替gradle

例:列出所有的任务

$ ./gradlew tasks

3 新建一个gradle项目

3.1 单模块

在这里插入图片描述
在这里插入图片描述
等待idea下载默认的gradle并初始化好项目后

在这里插入图片描述

3.1.1 gradle-wrapper.properties
#解压gradle的总目录
distributionBase=GRADLE_USER_HOME

#解压gradle总目录下的目录
distributionPath=wrapper/dists

#下载gradle的地址,和版本
#1. gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。
#2. gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。
#3. gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip

#下载gradle的总目录
zipStoreBase=GRADLE_USER_HOME

#下载gradle总目录下的目录
zipStorePath=wrapper/dists

GRADLE_USER_HOME:环境变量(类似于JAVA_HOME),gradle的用户目录,里面放gradle的相关配置等,类似于maven的.m2的文件路径。

  • Mac的默认目录是:/Users/xxx/.gradle
  • Windows的默认目录是:C:/用户/xxx/.gradle
3.1.2 settings.gradle
/**
 * 项目的名称
 */
rootProject.name = 'gradle-demo-project'
3.1.3 build.gradle
/**
 * 插件
 */
plugins {
    /**
     * 使用 'java-library' 代替 'java',功能更健全
     */
    id 'java-library'
    /**
     * 发布到仓库的插件
     */
    id 'maven-publish'
}

group 'org.example'
version '1.0-SNAPSHOT'

publishing {
    publications {
        /**
         * 默认发布
         * 默认的POM标识
         *      groupId -> project.group
         *      artifactId -> project.name
         *      version -> project.version
         */
        maven(MavenPublication) {
            from components.java
        }
        /**
         * 自定义发布
         */
        /*maven(MavenPublication) {
            groupId = 'org.gradle.sample'
            artifactId = 'library'
            version = '1.1'
            from components.java
        }*/
    }
    /**
     * 发布到私服
     */
    repositories {
        maven {
            /**
             * 7.0 指定是否可以通过不安全的 HTTP 连接与存储库进行通信。
             */
            allowInsecureProtocol(true)
            /**
             * 发布url,来自于/Users/xxx/.gradle/gradle-wrapper.properties
             */
            url nexus_publish_url
            /**
             * maven私服配置,为了避免密码明文,将用户名和密码申明成全局变量,在/Users/xxx/.gradle/gradle-wrapper.properties
             */
            credentials{
                username nexus_username
                password nexus_password
            }
        }
    }
}

repositories {
    /**
     * maven私服配置,maven   mavenLocal谁在前先找谁
     */
    maven {
        /**
         * 7.0 指定是否可以通过不安全的 HTTP 连接与存储库进行通信。
         */
        allowInsecureProtocol(true)
        /**
         * 来自于/Users/xxx/.gradle/gradle-wrapper.properties的全局变量
         */
        url nexus_url
    }
    /**
     * 优先找.m2路径下的settings.xml,如果没有的话使用默认的本地仓库地址.m2/repository
     * gradle建议避免使用mavenLocal(),Gradle不为本地存储库执行任何缓存,将影响构建性能
     */
    mavenLocal()
}

configurations.all {
    /**
     * 全局排除依赖
     */
    exclude module: 'logback-core'

    resolutionStrategy {
        /**
         * 强制某个依赖使用某个版本
         */
        force('org.slf4j:slf4j-api:1.7.15')
    }
}

dependencies {
    /**
     * 引入依赖,不会传递
     */
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.2'

    /**
     * 引入依赖,会传递
     */
    api 'com.fasterxml.jackson.core:jackson-core:2.13.2'

    /**
     * 排除依赖
     */
    implementation ('ch.qos.logback:logback-classic:1.2.9'){
        exclude group: 'org.slf4j',module: 'slf4j-log4j12'
    }

    /**
     * 引入测试依赖
     */
    testImplementation 'com.fasterxml.jackson.core:jackson-core:2.13.2'

    /**
     * 如果要引入lombok这种,必然有annotationProcessor和testAnnotationProcessor,不然会报错
     * 不同版本的gradle对lombok的注解支持版本不一样,请查看官网
     */
    annotationProcessor 'org.projectlombok:lombok:1.18.12'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
    implementation 'org.projectlombok:lombok:1.18.12'
}

/**
 * 复制src/main/resources/application.yml到构建目录(默认build)下的 项目名-server目录。$rootProject.name是settings.gradle中的项目名称
 * 本项目:复制src/main/resources/application.yml到/build/gradle-demo-project/
 */
task copyApplication(type: Copy) {
    into "$buildDir/$rootProject.name-server"
    from "src/main/resources/application.yml"
}

/**
 * 复制/bin目录下的除去version其他文件到/build/gradle-demo-project/bin/
 */
task copyBin(type: Copy) {
    into "$buildDir/$rootProject.name-server/bin"
    from "bin"
    exclude "version"
}

/**
 * 复制/build/libs/和项目依赖的所有jar到build/gradle-demo-project/lib/
 */
task copyToLib(type: Copy) {
    into "$buildDir/$rootProject.name-server/lib"
    from "$buildDir/libs"
    from configurations.runtimeClasspath
}

/**
 * 打zip包
 */
task dist(type: Zip) {
    /**
     * 执行copyApplication
     */
    dependsOn copyApplication
    /**
     * 执行copyBin
     */
    dependsOn copyBin
    /**
     * 执行copyToLib
     */
    dependsOn copyToLib
    /**
     * 打包哪个文件
     */
    from "$buildDir/$rootProject.name-server"
    /**
     * 打包的目标路径
     */
    destinationDir file('build')
    /**
     * 打包名称
     */
    baseName "$project.name"
}



/**
 * build后进行dist方法
 */
build.finalizedBy(dist)
3.1.3.1 build后的效果图

在这里插入图片描述

3.1.3.2 引入发布插件

在这里插入图片描述

  • generatePomFileForPubNamePublication
    • 为名为PubName的发布创建 POM 文件,填充已知的元数据,例如项目名称、项目版本和依赖项。
    • POM 文件的默认位置是build/publications/$pubName/pom-default.xml。
  • publishPubNamePublicationToRepoNameRepository
    • 将PubName发布发布到名为RepoName的存储库。
    • 如果您有一个没有明确名称的存储库定义,则 RepoName将为“Maven”。
  • publishPubNamePublicationToMavenLocal
    • 将PubName发布复制到本地 Maven 缓存(通常是$USER_HOME/.m2/repository)以及发布的 POM 文件和其他元数据。
  • publish
    • 取决于:所有任务publishPubNamePublicationToRepoNameRepository
    • 将所有定义的发布发布到所有定义的存储库的聚合任务。它不包括将发布复制到本地 Maven 缓存。
  • publishToMavenLocal
    • 取决于:所有任务publishPubNamePublicationToMavenLocal
    • 将所有定义的发布复制到本地 Maven 缓存,包括它们的元数据(POM 文件等)。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐