我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
第二篇 Gradle基础-02
文章内容速览:通过idea创建一个Gradle管理的项目(单体、多模块项目);build.gradle中依赖类型,项目结构介绍,以及如何构建项目
一、创建Gradle管理的项目
1.创建单个项目
idea创建项目
打开idea 点击左上角的 File->new->project,然后选择Gradle->Java->next
创建好的目录结构如下:
发现没有src目录,需要在build.gradle中添加 对应task 生成对应src
简单配置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;
}
}
构建项目
方式一:通过命令行
在idea中点击底部Terminal
//清除构建内容
gradle clean
//编译代码和配置文件
gradle classes
//构建项目并且不包含测试部分
gradle build -x test
//构建项目需要测试部分结果
gradle build
方式二:通过idea按钮
构建结果会在项目的build目录下
启动jar包
java -jar d:/project_code/learn_code/gradle-single-example/build/libs/gradle-single-example-1.0-SNAPSHOT.jar --server.port=18001
Build,Execution,Deployment->Gradle->Gradle projects
2.创建多模块项目
idea创建父工程
删除src
创建子工程
子项目:gradle-core-example
同样方式创建 子项目(gradle-api-example)
查看目录结构
创建之后可以查看目录结构如下,点击settings.gradle即可查看到项目之间的关系 其中include表示子项目名
修改父工程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模块中写业务功能
2.api模块中调用
构建项目
命令和单个项目一样,结果如下
启动项目
二、依赖方式及类型
依赖方式:主要分为直接依赖、项目依赖、本地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 |
providedCompile | war 插件提供支持,编译、测试阶段代码需要依赖此类jar 包,而运行阶段容器已经提供了相应的支持,所以无需将这些文件打入到war 包中了;例如servlet-api.jar、jsp-api.jar |
api | java-library 插件提供支持,这些依赖项可以传递性地导出给使用者,用于编译时和运行时。 |
runtime | runtime 依赖在运行和测试系统的时候需要,在编译的时候不需要,比如mysql 驱动包。在 gradle 7.0 已经移除 |
compile | 编译范围依赖在所有的 classpath 中可用,同时它们也会被打包。在gradle 7.0 已经移除 |
compileOnlyApi | java-library 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。 |
排除依赖
//不需要的依赖使用 exclude 进行排除
implementation ('com.aliyun:alibaba-dingtalk-service-sdk:2.0.0'){
exclude group:'log4j'
}
三、项目结构说明
1.项目目录结构说明
2.Wrapper包装器
主要作用是不同项目可以有不用的Gradle版本,也可以说是版本控制配置。实际上本地环境压根就不需要配置Gradle环境,通过Wrapper来进行操作即可
指定/修改项目Gradle版本
查看项目wrapper使用的Gradle版本(开始时未指定 对应的为7.1)
//升级wrapper版本号,只是修改gradle.properties中wrapper版本,实际未下载包
gradle wrapper --gradle-version=7.5.1
//构建时 会下载源码包
./graldew build -x test
wrapper 执行流程
- 当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
- 将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)
- 并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),使用相同版本的gradle就不下载了
- 之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本。
tips: GRALE_USER_HOME 环境变量用于这里的Gradle Wrapper 下载的特定版本的gradle 存储目录。如果我们没有配置过GRALE_USER_HOME 环境变量,默认在当前用户夹目录下的.gradle 文件夹中。idea可以配置