【Java】Gradle7.5.1 保姆级内容 Gradle基础-02

1,233 阅读5分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

第二篇 Gradle基础-02

文章内容速览:通过idea创建一个Gradle管理的项目(单体、多模块项目);build.gradle中依赖类型,项目结构介绍,以及如何构建项目

一、创建Gradle管理的项目

1.创建单个项目

idea创建项目

打开idea 点击左上角的 File->new->project,然后选择Gradle->Java->next

1663842902513.png

1663843329624.png

创建好的目录结构如下:

1663843704633.png

发现没有src目录,需要在build.gradle中添加 对应task 生成对应src

1663843941796.png

简单配置build.gradle
buildscript {
    repositories {
        //本地仓库
        mavenLocal()
        //阿里云仓库
        maven {
            url "https://maven.aliyun.com/repository/public"
        }
        //远程中央仓库
        mavenCentral()
        maven { url "https://repository.primefaces.org" }
    }
    dependencies {
        classpath('org.springframework.boot:spring-boot-gradle-plugin:2.7.0')// 加载插件,用到里面的函数方法
    }
​
}
​
apply plugin: 'java'
apply plugin: 'idea'
// 使用spring boot 框架
apply plugin: 'org.springframework.boot'
// 使用spring boot的自动依赖管理
apply plugin: 'io.spring.dependency-management'group 'org.example'
version '1.0-SNAPSHOT'
​
repositories {
    mavenLocal()
    maven {
        url "https://maven.aliyun.com/repository/public"
    }
    mavenCentral()
    maven { url "https://repository.primefaces.org" }
}
​
dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    compileOnly "org.projectlombok:lombok:1.18.22"
​
}
​
test {
    useJUnitPlatform()
}
//创建src目录
task createDirs {
    sourceSets*.java.srcDirs*.each {
        it.mkdirs()
    }
    sourceSets*.resources.srcDirs*.each{
        it.mkdirs()
    }
}
直接启动项目验证
package org.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@RequestMapping("/student")
public class StudentController {
    @GetMapping("/say/{msg}")
    public String sayMsg(@PathVariable("msg") String msg) {
        return "hello " + msg;
    }
​
}

1664262427777.png

构建项目

方式一:通过命令行

在idea中点击底部Terminal

//清除构建内容
gradle clean
//编译代码和配置文件
gradle classes
//构建项目并且不包含测试部分
gradle build -x test
//构建项目需要测试部分结果
gradle build

1664263308863.png

方式二:通过idea按钮

1664263585111.png

构建结果会在项目的build目录下

1663844853906.png

启动jar包
java -jar d:/project_code/learn_code/gradle-single-example/build/libs/gradle-single-example-1.0-SNAPSHOT.jar --server.port=18001

1664264486438.png

Build,Execution,Deployment->Gradle->Gradle projects

2.创建多模块项目

idea创建父工程

1664282006387.png

1664282118841.png

删除src

1664282244841.png

创建子工程

子项目:gradle-core-example

1664282348186.png

1664282408108.png

同样方式创建 子项目(gradle-api-example)

查看目录结构

创建之后可以查看目录结构如下,点击settings.gradle即可查看到项目之间的关系 其中include表示子项目名

1664282728474.png

修改父工程build.gradle配置文件
buildscript {
    repositories {
        mavenLocal()
        maven {
            url "https://maven.aliyun.com/repository/public"
        }
        mavenCentral()
        maven { url "https://repository.primefaces.org" }
    }
    dependencies {
        classpath('org.springframework.boot:spring-boot-gradle-plugin:2.7.0')// 加载插件,用到里面的函数方法
    }
    ext{
        springBootVersion='2.7.0'
    }
}
​
​
plugins {
    id 'java'
    //apply false 表示不应有父工程
    id 'org.springframework.boot' version "${springBootVersion}" apply false
    //使用spring boot的自动依赖管理
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
​
group 'org.example'
version '1.0-SNAPSHOT'//对所有项目的配置,包含父项目
allprojects {
    group 'org.example'
    version '1.0-SNAPSHOT'
//指定语言
    apply plugin: 'java'
    //指定编辑器
    apply plugin: 'idea'
    apply plugin: 'io.spring.dependency-management'
​
    // 编译相关参数
    compileJava {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
        options.encoding = 'UTF-8'
        options.compilerArgs = [
                '-Xlint:all', '-Xlint:-processing'
        ]
    }
​
    // 仓库
    repositories {
        mavenLocal()
        // 有私服就在此配置
        //阿里云仓库
        maven {
            url "https://maven.aliyun.com/repository/public"
        }
        //中央仓库
        mavenCentral()
        maven { url "https://repository.primefaces.org" }
​
        // grandle插件
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
}
​
// 指定依赖jar的版本 类似maven的dependencyManagement,子模块在依赖时可以不用指定版本
allprojects { project ->
    buildscript {
        dependencyManagement {
            imports {
                mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
                mavenBom "org.junit:junit-bom:5.7.0"
            }
​
            dependencies {
                dependency 'org.projectlombok:lombok:1.16.16'
                dependency 'org.apache.commons:commons-lang3:3.11'
                dependency 'commons-collections:commons-collections:3.2.2'
                dependency 'com.alibaba.fastjson2:fastjson2:2.0.8'
                dependency 'cn.hutool:hutool-all:5.7.16'
                dependency 'io.jsonwebtoken:jjwt:0.9.0'
​
            }
        }
    }
}
配置子模块build.gradle

gradle-core-example模块

// 构建二方库的插件
plugins {
    id 'java-library'
}
​
// 这里可以指定构建出来的jar的文件名
archivesBaseName = 'gradle-core-example'// 子模块自己的依赖
dependencies {
    api('org.springframework.boot:spring-boot-starter')
    api('org.springframework.boot:spring-boot-starter-web')
    // 使用api,将依赖传递给使用该jar的模块
    api 'org.projectlombok:lombok'
    // annotationProcessor不会传递,使用了lombok生成代码的模块,需要自己声明annotationProcessor
    annotationProcessor 'org.projectlombok:lombok'
    api 'com.alibaba.fastjson2:fastjson2'
​
}
​

gradle-api-example模块

plugins {
    id 'org.springframework.boot'
}
​
// 用了插件org.springframework.boot之后,jar task会失效,可用bootJar取代
bootJar {
    archiveBaseName = project.name
    archiveVersion = project.version
}
​
// 这里可以指定构建出来的jar的文件名
archivesBaseName = 'gradle-api-example'
​
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
​
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 二方库依赖
    implementation project(':gradle-core-example')
    // lombok不会传递,使用了lombok生成代码的模块,需要自己声明annotationProcessor
    annotationProcessor 'org.projectlombok:lombok'
}
​
test {
    useJUnitPlatform()
}
idea中验证项目

1.core模块中写业务功能

1664284970926.png

2.api模块中调用

1664285016966.png

构建项目

命令和单个项目一样,结果如下

1664285131275.png

启动项目

1664284780761.png

二、依赖方式及类型

依赖方式:主要分为直接依赖、项目依赖、本地Jar依赖

直接依赖
//完整写法
implementation group: 'org.projectlombok', name: 'lombok', version: '1.16.16'
//简写
implementation 'org.projectlombok:lombok:1.16.16'
项目依赖
implementation project(':gradle-core-example')
本地Jar依赖
//依赖某个文件
implementation files(**'libs/customer.jar'**, **'libs/biz.jar'**)
依赖类型
compileOnly由java插件提供,适用于编译期需要而不需要打包的情况
runtimeOnly由 java 插件提供,只在运行期有效,编译时不需要,比如mysql 驱动包。
implementation由 java 插件提供,针对源码[src/main 目录] ,在编译、运行时都有效,无传递性。取代老版本中被移除的 compile
testCompileOnly由 java 插件提供,用于编译测试的依赖项,运行时不需要
testRuntimeOnly由 java 插件提供,只在测试运行时需要,取代老版本中被移除的testRuntime
testImplementation由 java 插件提供,针对测试代码[src/test 目录] 取代老版本中被移除的testCompile
providedCompilewar 插件提供支持,编译、测试阶段代码需要依赖此类jar 包,而运行阶段容器已经提供了相应的支持,所以无需将这些文件打入到war 包中了;例如servlet-api.jar、jsp-api.jar
apijava-library 插件提供支持,这些依赖项可以传递性地导出给使用者,用于编译时和运行时。
runtimeruntime 依赖在运行和测试系统的时候需要,在编译的时候不需要,比如mysql 驱动包。在 gradle 7.0 已经移除
compile编译范围依赖在所有的 classpath 中可用,同时它们也会被打包。在gradle 7.0 已经移除
compileOnlyApijava-library 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。
排除依赖
//不需要的依赖使用 exclude 进行排除
implementation ('com.aliyun:alibaba-dingtalk-service-sdk:2.0.0'){
        exclude group:'log4j'
    }

三、项目结构说明

1.项目目录结构说明

1664287028686.png

2.Wrapper包装器

主要作用是不同项目可以有不用的Gradle版本,也可以说是版本控制配置。实际上本地环境压根就不需要配置Gradle环境,通过Wrapper来进行操作即可

指定/修改项目Gradle版本

查看项目wrapper使用的Gradle版本(开始时未指定 对应的为7.1)

1664287435628.png

//升级wrapper版本号,只是修改gradle.properties中wrapper版本,实际未下载包
gradle wrapper --gradle-version=7.5.1
//构建时 会下载源码包
./graldew build -x test

1664287618809.png

wrapper 执行流程
  1. 当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
  2. 将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)
  3. 并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),使用相同版本的gradle就不下载了
  4. 之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本。
tips: GRALE_USER_HOME 环境变量用于这里的Gradle Wrapper 下载的特定版本的gradle 存储目录。如果我们没有配置过GRALE_USER_HOME 环境变量,默认在当前用户夹目录下的.gradle 文件夹中。idea可以配置

1664287948794.png