一、环境参数
- MacBook Pro (13-inch, M1, 2020) Apple M1
- java version “1.8.0_291”
- Gradle 7.5.1
- IntelliJ IDEA 2022.2.2 (Community Edition)
二、基本命令
指令 | 作用 |
---|---|
gradle clean | 清空build目录 |
gradle classes | 编译业务代码和配置文件 |
gradle test | 编译测试代码,生产测试报告 |
gradle build | 构建项目 |
gradle build -x test | 跳过测试构建构建 |
三、修改maven下载源
主要通过两个方式修改maven的下载源。
- 第一种是全局修改,在开发环境中电脑上修改GRADEL_HOME下的配置文件;
- 第二种是针对单一项目修改maven源、
1、全局修改 – init.gradle文件
==在windows环境下的gradle_home 目录下默认有一个init.d的文件夹;而macos中是没有的init.d文件夹,但是不影响整体的配置效果,Macos用户只需要收到创建对应的文件夹即可==
- 在 gradle 的 init.d 目录下创建以.gradle 结尾的文件,.gradle 文件可以实现在 build 开始之前执行
- 在 init.d 文件夹创建 init.gradle 文件,文件内容如下
allprojects { repositories { mavenLocal() maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" } mavenCentral() } buildscript { repositories { maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' } maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' } maven { name "M2" ; url 'https://plugins.gradle.org/m2/' } } } }
==allprojects 是对所有 project(包括 Root Project+ child Project[当前工程和所有子工程])的进行统一配置,而 subprojects 是对所有 Child Project 的进行统一配置。==
如果是直接在根 project 配置 repositories 和 dependencies 则只针对根工程有效。 - 启用 init.gradle 文件的方法有以下说明
1.在命令行指定文件,例如:gradle --init-script yourdir/init.gradle -q taskName。你可以多次输入此命令来指定多个init文件
2.把init.gradle文件放到 USER_HOME/.gradle/ 目录下
3.把以.gradle结尾的文件放到 USER_HOME/.gradle/init.d/ 目录下
4.把以.gradle结尾的文件放到 GRADLE_HOME/init.d/ 目录下
如果存在上面的4种方式的2种以上,gradle会按上面的1-4序号依次执行这些文件,
如果给定目录下存在多个init脚本,会按拼音a-z顺序执行这些脚本,每个init脚本都存在一个对应的gradle实例,
你在这个文件中调用的所有方法和属性,都会 委托给这个gradle实例,每个init脚本都实现了Script接口。
- 仓库说明
mavenLocal(): 指定使用maven本地仓库,而本地仓库在配置maven时settings文件指定的仓库位置。如E:/repository,gradle 查找jar包顺序如下:USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository
mavenCentral():这是Maven的中央仓库,无需配置,直接声明就可以使用
gradle可以通过指定仓库地址为本地maven仓库地址和远程仓库地址相结合的方式;默认在 USER_HOME/.gradle/caches目录,当然如果我们配置过GRADLE_USER_HOME环境变量,则会放在 GRADLE_USER_HOME/caches目录
那么可不可以将gradle caches指向maven repository。我们说这是不行的,caches下载 文件不是按照maven仓库中存放的方式
- 阿里云仓库地址请参考:https://developer.aliyun.com/mvn/guide
- GRALE_USER_HOME 相当于配置 Gradle 本地仓库位置和 Gradle Wrapper 缓存目录。没有配置过 GRALE_USER_HOME 环境变量,默认在当前用户家目录下的.gradle 文件夹中
2、局部修改 – build.gradle 文件
每个gradle项目目录下会有一个build.gradle文件,它可以通过与init.gradle文件一下的配置内容来执行maven的下载源头
- uild.gradle 是一个 gradle 的构建脚本文件,支持 java、groovy 等语言。
- 每个 project 都会有一个 build.gradle 文件,该文件是项目构建的入口,可配置版本、插件、依赖库等信息。
- 每个 build 文件都有一个对应的 Project 实例,对 build.gradle 文件配置,本质就是设置 Project 实例的属性和方法。
- 由于每个 project 都会有一个 build 文件,那么 Root Project 也不列外.Root Project 可以获取到所有 Child Project,所以在
Root Project 的 build 文件中我们可以对 Child Project 统一配置,比如应用的插件、依赖的 maven 中心仓库等。
2.1 常见属性
//指定使用什么版本的JDK语法编译源代码,跟编译环境有关,在有java插件时才能用
sourceCompatibility = 1.8 //指定生成特定于某个JDK版本的class文件:跟运行环境有关,在有java插件时才能用
targetCompatibility = 1.8
//业务编码字符集,注意这是指定源码解码的字符集[编译器]
compileJava.options.encoding "UTF-8"
//测试编码字符集,注意这是指定源码解码的字符集[编译器]
compileTestJava.options.encoding "UTF-8"
//编译JA VA文件时采用UTF-8:注意这是指定源码编码的字符集【源文件】
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//编译JA VA文件时采用UTF-8:注意这是指定文档编码的字符集【源文件】
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}
2.2 Repositories
repositories {
//gradle中会按着仓库配置的顺序,从上往下依次去对应的仓库中找所需要的jar包: //如果找到,则停止向下搜索,如果找不到,继续在下面的仓库中查找 //指定去本地某个磁盘目录中查找:使用本地file文件协议:一般不用这种方式
maven {
url 'file:///D:/repos/mavenrepos3.5.4'
}
maven { url "$rootDir/lib/release" }
//指定去maven的本地仓库查找
mavenLocal()
//指定去maven的私服或者第三方镜像仓库查找
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" } //指定去maven的远程仓库查找:即 https://repo.maven.apache.org/maven2/ mavenCentral()
//去google仓库查找
google()
}
2.3 ext 用户自定义属性
//自定义一个Project的属性
ext.age = 18
//通过代码块同时自定义多个属性
ext {
phone = 19292883833
address="北京尚硅谷"
}
task extCustomProperty {
//在task中自定义属性
ext {
desc = "奥利给"
}
doLast {
println "年龄是:${age}"
println "电话是:${phone}"
println "地址是:${address}"
println "尚硅谷:${desc}"
}
}
2.4 gradle.properties
ext 配置的是用户自定义属性,而 gradle.properties 中一般定义 系统属性、环境变量、项目属性、JVM 相关配置 信息。
详细请参考:https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties
## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
org.gradle.jvmargs=-Xms4096m -Xmx8192m
## 开启gradle缓存
org.gradle.caching=true
#开启并行编译
org.gradle.parallel=true
#启用新的孵化模式
org.gradle.configureondemand=true
#开启守护进程
org.gradle.daemon=true
2.5 Buildscript
- buildscript 里是 gradle 脚本执行所需依赖,分别是对应的 maven 库和插件
- buildscript{}必须在 build.gradle 文件的最前端
- 对于多项目构建,项目的 buildscript()方法声明的依赖关系可用于其所有子项目的构建脚本
- 构建脚本依赖可能是 Gradle 插件
案例1:
import org.apache.commons.codec.binary.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2
}
}
tasks.register('encode') {
doLast {
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}
案例2:
//老式apply插件的引用方式,使用apply+buildscript
buildscript {
ext {
springBootVersion = "2.3.3.RELEASE"
}
repositories {
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
jcenter()
} //此处引入插件
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java' //核心插件,无需事先引入
apply plugin: 'org.springframework.boot' //社区插件,需要事先引入,才能应用,不必写版本号
四、Wrapper 包装器
Gradle Wrapper 实际上就是对 Gradle 的一层包装,用于解决实际开发中可能会遇到的不同的项目需要不同版本的 Gradle 问题;
新建的Gradle项目都会有一个gradle文件夹,如下,它的子目录是wrapper,而wrapper文件夹下有gradle-wrapper.jar和gradle-wrapper.properties两个文件
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── lifefunker
│ │ └── Main.java
│ └── resources
└── test
├── java
└── resources
- 何时使用 gradle wrapper?
- 本地电脑没有gradle
- 电脑已有gradle版本过旧
- 如何使用 gradle wrapper?
- 项目中的gradlew、gradlew .cmd脚本用的就是wrapper中规定的gradle版本
- gradlew、gradlew .cmd的使用方式与gradle使用方式完全一致,只不过把gradle指令换成了gradlew指令
- gradle指令和gradlew指令所使用的gradle版本有可能是不一样的
- 主要参数
参数名 | 说明 |
---|---|
–gradle-version | 用于指定使用的gradle版本 |
–gradle-distribution-url | 用于指定下载gradle发行版的url地址 |
Demo:
- gradle wrapper –gradle-version=4.4:升级wrapper版本号,只是修改gradle.properties中wrapper版本,未实际下载
- gradle wrapper –gradle-version 5.2.1 –distribution-type all :关联源码用
- GradleWrapper执行流程
- 1.当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
- 2.准确的将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)
- 3.并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),下载再使用相同版本的gradle就不用下载了
- 4.之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本
- gradle-wrapper.properties 说明
字段名称 | 说明 |
---|---|
distributionBase | 下载Gradle压缩包解压后存储的主目录 |
distributionPath | 相对于distributionBase的解压后的gradle压缩包的路径 |
distributionUrl | Gradle发行版压缩包的下载地址 |
zipStoreBase | 同distributionBase,但是存放的是zip压缩包 |
zipStorePath | 同distributionPath,存放的是zip压缩包 |
五、java插件
官网:https://docs.gradle.org/current/userguide/plugin_reference.html,以 Java 插件为例。
一些插件对工程目结构有约定,所以我们一般遵循它的约定结构来创建工程,这也是 Gradle 的“约定优于配置”原则
- 插件引入
plugins { id 'java' }
- java 插件规定的项目源集目录
└── src ├── main │ ├── java │ │ └── org │ │ └── lifefunker │ │ └── Main.java │ └── resources └── test ├── java └── resources
修改默认目录结构, 如下操作
```groovy
sourceSets {
main {
java {
srcDirs = ['src/java']
}
resources {
srcDirs = ['src/resources'] }
}
}
- java插件常见属性
属性名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
reportsDirName | String | reports | 生成报告的目录名称 |
reportsDir | File(只读) | buildDir/reportsDirName | 生成报告的目录 |
testResultsDirName | String | test-results | 生成测试 result.xml 文件的目录名称 |
testResultsDir | File(只读) | reportsDir/testReportDirName | 生成测试报告的目录 |
libsDirName | String | libs | 生成 lib 库的目录名称 |
libsDir | File(只读) | buildDir/libsDirName | 生成 lib 库的目录 |
distsDirName | String | distributions | 生成发布文件的目录名称 |
distsDir | File(只读) | buildDir/distsDirName | 生成发布文件的目录 |
docsDirName | String | docs | 生成帮助文档的目录名称 |
docsDir | File(只读) | buildDi r/docsDirName | 生成帮助文档的目录 |
dependencyCacheDirName | String | dependency-cache | 存储缓存资源依赖信息的目录名称 |
dependencyCacheDir | File(只读) | buildDir/dependencyCacheDirName | 存储缓存资源依赖信息的目录 |
sourceSets | SourceSetContainer | (只读) Not null | 包含工程的资源集合(source sets.) |
sourceCompatibility | JavaVersion,也可以使用字符串或数字比如 ‘1.5’ 或者 1.5 | 根据使用的 JVM 定 | 编译 java 文件时指定使用的 java 版本 |
targetCompatibility | JavaVersion,也可以使用字符串或数字比如 ‘1.5’ 或者 1.5 | sourceCompatibility | 生成 classes 的 java 版本 |
archivesBaseName | String | projectName | 作为归档文件的默认名称,如 JAR 或者 ZIP 文件的名称 |
- 常见的依赖类型
类型名称 | 说明 |
---|---|
compileOnly | 由 java 插件提供,曾短暂的叫 provided,后续版本已经改成了 compileOnly,适用于编译期需要而不需要打包的情 况 |
runtimeOnly | 由 java 插件提供,只在运行期有效,编译时不需要,比如 mysql 驱动包。,取代老版本中被移除的 runtime |
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 |
compile | 编译范围依赖在所有的 classpath 中可用,同时它们也会被打包。在 gradle 7.0 已经移除 |
runtime | runtime 依赖在运行和测试系统的时候需要,在编译的时候不需要,比如 mysql 驱动包。在 gradle 7.0 已经移除 |
api | java-library 插件提供支持,这些依赖项可以传递性地导出给使用者,用于编译时和运行时。取代老版本中被 移除的 compile |
compileOnlyApi | java-library 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。 |
官方文档参考:
- https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin: 各个依赖范围的关系和说明
- https://docs.gradle.org/current/userguide/upgrading_version_6.html#sec:configuration_removal : 依赖范围升级和移除
- https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin:API 和 implemention 区别
- https://docs.gradle.org/current/userguide/java_plugin.html#java_plugin: 执行 java 命令时都使用了哪些依赖范围的依赖。
- 提示 1:java 插件提供的功能,java-library 插件都提供。
六、Gretty插件
在 idea 新版本的创建项目中,无法自己选择创建项目是普通 java 工程还是 web 工程了【IDEA 旧版本是可以的】,所以我 们如果想创建 web 工程,只需要自己在 src/main/目录下添加 webapp/WEB-INF/web.xml 及页面即可。
- 底层支持 jetty,tomcat 等 Servlet 容器
- 支持项目热部署、HTTPS、调试
-
效果等同于将项目打成 war 包,部署到本地 tomcat 运行
- 引入插件
plugins { id ‘war’ id 'org.gretty' version '2.2.0' }
引入插件后,刷新右边框的gradle插件,加载几分钟后插件中间就会有gretty插件的具体的任务列表
- 指定maven仓库
repositories { //指定jcenter仓库,一定要放在前面 jcenter() mavenCentral() }
- 设置gretty插件参数
gretty { httpPort = 8888 contextPath = "/web" debugPort = 5005 debugSuspend = true httpsEnabled = true managedClassReload=true //修改了类之后重新加载 //servletContainer = 'tomcat8' //如果不指定默认的servlet容器,支持tomcat7/8,默认是使用的是Jetty服务器 httpsPort = 4431 }
- 运行
gradle appRun
七、SpringBoot插件
- 引入插件
plugins { id 'org.springframework.boot'version'2.3.7.RELEASE' //维护springboot版本号,不单独使用,和下面两个插件一起用 id 'io.spring.dependency-management' version '1.0.10.RELEASE' //进行依赖管理,在引入其它boot依赖时省略版本号、解决jar包冲突问题 id 'java' }
- 引入依赖
dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' //省略版本,原生bom支持,插件management提供 testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } test { useJUnitPlatform() }
- 执行命令
要想运行当前 Springboot 项目,直接执行 gradle bootRun 指令或者 idea 右侧按钮即可。
当然如果想让当前项目打成可执行 jar 包,只需执行: gradle bootJar 指令即可。
Cloud 项目创建也可以借助于脚手架创建,与 Boot 项目类似。 - 引入插件
- 拓展spring-boot-gradle-plugin 插件
buildscript { repositories { maven { url 'https://maven.aliyun.com/repository/public' } } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.4.1' } } apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'
八、maven发布插件
- 引入插件
plugins { id 'java-library' //如果发布war包,需要war插件,java-library支持带源码、文档发布 id 'maven-publish' }
- 设置发布代码
//带源码和javadoc的发布:需要'java-library'插件支持:它是java的升级版,java插件的功能java-library都有 //javadoc.options.encoding="UTF-8" //java { // withJavadocJar() // withSourcesJar() //} publishing { publications { myLibrary(MavenPublication) { groupId = 'org.gradle.sample' //指定GAV坐标信息 artifactId = 'library' version = '1.1' from components.java//发布jar包 //from components.web///引入war插件,发布war包 } } repositories { //本地仓库位于USER_HOME/.m2/repository mavenLocal() //发布项目到私服中 maven{ name = 'myRepo' //name属性可选,表示仓库名称,url必填 //发布地址:可以是本地仓库或者maven私服 //url = layout.buildDirectory.dir("repo") // change URLs to point to your repos, e.g. http://my.org/repo def releasesRepoUrl = layout.buildDirectory.dir('repos/releases') def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots') url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl credentials{ username = 'user' password = 'secret' } } } }
-
执行命令
执行发布命令,将项目发布到本地仓库或者远程仓库。常见的发布指令有:
- generatePomFileForPubNamePublication: 生成 pom 文件
- publishPubNamePublicationToRepoNameRepository:发布项目到指定仓库,如果没有仓库名,默认为 maven
- publishPubNamePublicationToMavenLocal: 将 PubName 发布复制到本地 Maven 仓库中包括 POM 文件和其他元数据。
- publish: 发布到 repositories 中指定的仓库(为比如 Maven 私服)
- publishToMavenLocal: 执行所有发布任务中的操作发布到本地 maven 仓库【默认在用户家目录下的.m2/repository】。