下载地址:https://services.gradle.org/distributions/
要根据开发工具选择对应版本,例如idea 2018,gradle只能选择5.7以下版本
配置环境变量
新建环境变量 GRADLE_HOME,即E:\dev\gradle-5.6.4
修改环境变量 Path,即追加 %GRADLE_HOME%\bin
设置本地仓库目录
GRADLE_USER_HOME=D:\gradle\repo
如果不设置本地仓库目录,idea命令行使用gradle命令时会重新下载依赖到系统用户目录下的.gradle
验证:
gradle -v
Idea配置gradle
仓库下载地址全局配置
在gradle安装目录下的init.d目录下创建init.gradle
E:\dev\gradle-5.6.4\init.d
添加全局仓库配置后,在gradle工程不需要再配置依赖包下载地址
init.gradle内容如下:
allprojects {
repositories {
//maven { url 'file:///C:/Java/maven_repository'}
//mavenLocal()
//https://www.jianshu.com/p/ab1f5e5f5f5c
maven { name "Nexus" ; url "http://127.0.0.1:8081/repository/maven-public/" }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "http://nexus.bsdn.org/content/groups/public/" }
mavenCentral()
}
buildscript {
repositories {
maven { name "Nexus" ; url "http://127.0.0.1:8081/repository/maven-public/" }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'http://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
2. Gradle 使用
2.1 Gradle下载的依赖jar包路径位置
GRADLE_USER_HOME/caches/modules-2/files-2.1
2.2 Gradle 强制依赖
在build.gradle中添加如下配置:
configurations.all {
resolutionStrategy {
force 'com.github.bumptech.glide:glide:4.2.0'
force 'com.github.bumptech.glide:compiler:4.2.0'
}
}
其他方式:
compile('com.squareup.okhttp:okhttp-mt:2.5.0') {
force = true
}
2.3 Gradle 移除依赖
1.直接在configuration中排除
configurations {
compile.exclude module: 'commons'
all*.exclude group: 'org.gradle.test.excludes', module: 'reports'
}
2.在具体的某个dependency中排除
dependencies {
compile("org.gradle.test.excludes:api:1.0") {
exclude module: 'shared'
}
}
2.4 Gradle mybatis逆向工程
https://segmentfault.com/a/1190000013534059
https://www.jianshu.com/p/57ba8e9fccca
1、build.gradle配置
buildscript {
ext {
//spring boot 版本
bootVersion = '2.3.2.RELEASE'
}
//springboot gradle插件配置
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${bootVersion}")
// mybatis-generator 插件路径
// classpath "gradle.plugin.com.arenagod.gradle:mybatis-generator-plugin:1.4"
classpath "gradle.plugin.com.thinkimi.gradle:mybatis-generator-plugin:2.2"
}
}
//引入 mybatis-generator 插件
//apply plugin: "com.arenagod.gradle.MybatisGenerator"
apply plugin: "com.thinkimi.gradle.MybatisGenerator"
引入mybatis-generator-plugin,上面两个插件都可以,第一个插件比较旧2017年的,第二个插件有继续维护
2、Mybatis所需包引入,需要用mybatisGenerator引入,否则执行逆向工程时,会报找不到包错误
//逆向工程所需jar
mybatisGenerator 'mysql:mysql-connector-java:8.0.12'
//mybatisGenerator 'tk.mybatis:mapper-spring-boot-starter:2.1.5'
//mybatis-generator core 包
mybatisGenerator group: 'org.mybatis.generator', name: 'mybatis-generator-core', version:'1.3.7'
// https://github.com/itfsw/mybatis-generator-plugin
mybatisGenerator group: 'com.itfsw', name: 'mybatis-generator-plugin', version:'1.3.8'
mybatisGenerator group: 'tk.mybatis', name: 'mapper', version:'4.1.5'
3、指定generator xml位置
configurations {
mybatisGenerator
}
// mybatis-generator.xml 配置路径
//这里会遇到个问题:MyBatis Generator 通过xml生成,有日志但是没有生成文件成功的问题,
//原因:mac下是找不到 ./src 路径的,需要全路径,如下配置。windows则为src/main/resources/mybatis-generator.xml
mybatisGenerator {
verbose = true
// 不覆盖
overwrite = false
configFile = 'src/main/resources/mybatis-generator.xml'
}
4、执行mbGenerator
或者idea 命令行:
gradle mbGenerator
2.5 Gradle docker打包
1、引入docker插件
classpath 'com.palantir.gradle.docker:gradle-docker:0.25.0'
apply plugin: 'com.palantir.docker'
其他docker插件
com.bmuschko:gradle-docker-plugin:6.6.1
https://github.com/bmuschko/gradle-docker-plugin/tree/master/src/docs/samples/code
2、build.gradle配置
docker {
//dependsOn build
// bootJar 这样才会打成可执行jar包
dependsOn bootJar
dockerfile file('src/main/docker/Dockerfile')
name "${project.group}/${bootJar.archiveBaseName}"
// project.displayName/project.version
files bootJar.archiveFile
buildArgs(['JAR_FILE': "${bootJar.archiveFileName.get()}"])
println "###########JAR_FILE:-----${bootJar.archiveFileName.get()}#############"
println "###########JAR_FILE:-----${bootJar.archiveFile.get()}#############"
}
3、DockerFile
参考:
https://blog.csdn.net/wangxudongx/article/details/106982201
FROM java:8-jre-alpine
#用于指定持久化目录
VOLUME /tmp
RUN mkdir /app
#用于指定传递给构建运行时的变量
ARG JAR_FILE
#ADD yunfei-web-demo-0.0.1-SNAPSHOT.jar /app/app.jar
#ADD 更高级的复制文件
#ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能
ADD ${JAR_FILE} /app/app.jar
ADD runboot.sh /app/
#它的作用等同于拷贝文件到容器也可以直接写成ADD xx.jar /xx.jar
#为了执行一个touch命令,前面的add命令把jar复制过去,后面touch命令的作用是修改这个文件的访问时间和修改时间为当前时间
RUN sh -c 'touch /app/app.jar'
WORKDIR /app
RUN chmod a+x runboot.sh
#指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8082
#指令就是用于指定默认的容器主进程的启动命令的
CMD /app/runboot.sh
Runboot.sh
#!/usr/bin/env bash
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
echo "set time success "
sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
写法二:没有bash语法,可以使用alpine镜像,打出来镜像体积小
#FROM java:8-jre-alpine
#FROM openjdk:8-jdk-alpine
#镜像体积较小
FROM openjdk:8-jre-alpine
#VOLUME /root/tmp
VOLUME /tmp
ARG JAR_FILE
#COPY ${JAR_FILE} /app.jar
ADD ${JAR_FILE} /app.jar
#ADD libs/yunfei-web-demo-0.0.1-SNAPSHOT.jar /app.jar
#ENTRYPOINT 在容器启动后执行 java 命令来运行程序
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8813
4、IDEA运行docker命令
命令行方式:
//project 需替换为项目名称,工作路径在父级 gradle.build当中时,可以省略
//module 需替换为module名称
$ gradle project:module docker
或
$gradle :module docker
gradle :yunfei-web-demo docker
5、参考
https://cloud.tencent.com/developer/ask/126069
https://blog.csdn.net/soslinken/article/details/79401607
https://www.jianshu.com/p/7571fa3b394c
https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:files(java.lang.Object,%20org.gradle.api.Action)
http://codingdict.com/questions/37337
2.6 Gradle 生成pom.xml文件
apply plugin: 'maven'
//转成pom文件
task createPom {
pom {
project {
groupId project.group
artifactId project.name
version project.version
}
}.writeTo("$buildDir/pom.xml")
}
执行gradle createPom
参考:
https://www.cnblogs.com/tubeWang/p/11687201.html
https://developer.aliyun.com/article/238255
task createPom << {
pom {
project {
groupId 'com.lockbur'
artifactId 'lockbur-server'
version '1.0.0-SNAPSHOT'
inceptionYear '2008'
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
}.writeTo("$buildDir/pom.xml")
}
2.7 Gradle doLast
println 'This is done in configuration phase'
task mytask1(){
println 'This is also done in configuration phase by mytask1'
}
task mytask2() {
doLast{
println 'This is done in execution phase by mytask2'
}
println 'This is also done in configuration phase by mytask2'
}
println 'This is done in configuration phase as well'
实验一
gradle tasks
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well
实验二
gradle mytask2
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well
:mytask2
This is done in execution phase by mytask2
可以看到,doLast之外的内容,无论如何都会执行,而且是在configuration阶段执行。而doLast内的内容只会在task名作为参数传入的时候才会执行,而且是在execute阶段执行
链接:https://www.jianshu.com/p/87a4b581c0e9
2.8 Gradle 常用命令
https://www.cnblogs.com/lucas1024/p/9533566.html
#查看所有可用的task
gradle task
#编译(编译过程中会进行单元测试)
gradle build
#单元测试
gradle test
#编译时跳过单元测试
gradle build -x test
#直接运行项目
gradle run
#清空所有编译、打包生成的文件(即:清空build目录)
gradle clean
#生成mybatis的model、mapper、xml映射文件,注: 生成前,先修改src/main/resources/generatorConfig.xml 文件中的相关参数 , 比如:mysql连接串,目标文件的生成路径等等
gradle mybatisGenerate
#生成可运行的jar包,生成的文件在build/install/hello-gradle下,其中子目录bin下为启动脚本, 子目录lib为生成的jar包
gradle installApp
#打包源代码,打包后的源代码,在build/libs目录下
gradle sourcesJar
#打包可执行jar包,在build/libs目录下
gradle bootJar
#安装到本机maven仓库,此命令跟maven install的效果一样
gradle install
#生成pom.xml文件,将会在build根目录下生成pom.xml文件,把它复制项目根目录下,即可将gradle方便转成maven项目
gradle createPom
3. 常见错误
3.1 Gradle springboot 多模块打包错误
gradle springboot 多模块,在父模块执行bootJar,报错Main class name has not been configured and it could not be resolved
解决如下:
在父模块build.gradle文件里添加
bootJar {
enabled = false // 默认不需要打可执行jar包
}
子模块如果不需要打成可执行jar包,在子模块的build.gradle配置文件中添加以上配置
子模块打jar包公共配置,在父build.gradle中添加
jar { enabled = true}
参考:
https://www.jianshu.com/p/439a8b6a7617
https://blog.csdn.net/qq_43813937/article/details/106869813
https://blog.csdn.net/zekeTao/article/details/79525200
https://blog.csdn.net/chuxia5636/article/details/100684220
3.2 Gradle lombok
链接:https://www.orchome.com/1621
// lombok
annotationProcessor 'org.projectlombok:lombok:1.18.10'
compile 'org.projectlombok:lombok:1.18.10'
// testCompileOnly 'org.projectlombok:lombok:1.18.10'
// testAnnotationProcessor 'org.projectlombok:lombok:1.18.10'
如果不添加annotationProcessor ,打包会报错,找不到get、set方法
3、在Settings设置页面,我们点击Build,Execution,Deployment --> 选择Compiler-->选中Annotation Processors,然后在右侧勾选Enable annotation processing即可。
3.3 Idea 无法启动gradle项目
检查build tools>Gradle>Runner
Delegate IDE有没有打勾,有打勾去掉,就可以正常启动项目
3.4 Gradle docker打包报错
https://www.cnblogs.com/xiaoyao-001/p/13193879.html
https://github.com/docker/for-linux/issues/90
ADD failed:
stat /var/lib/docker/tmp/docker-builder417385810/runboot.sh: no such file or directory
出现以上错误原因,在dockerFile所在目录没有找到runboot.sh,但是runboot.sh与dockerFile在同一目录,原因在于gradle docker打包配置时只指定了dockerFile路径,修改后的脚本如下
把dockerfile file('src/main/docker/Dockerfile')改为
dockerfile file('src/main/docker')
docker {
dependsOn build
// dockerfile需要指定为docker文件所在目录,不能只指定Dockerfile路径,
// docker打包时会找不到其他文件
//dockerfile file('src/main/docker/Dockerfile')
dockerfile file('src/main/docker')
name "${project.group}/${bootJar.archiveBaseName.get()}"
// project.displayName/project.version
files bootJar.archiveFile.get()
buildArgs(['JAR_FILE': "${bootJar.archiveFileName.get()}"])
println "###########JAR_FILE:-----${bootJar.archiveFileName.get()}#############"
println "###########JAR_FILE:-----${bootJar.archiveFile.get()}#############"
}
4. 常见问题
4.1 Gradle buildScript
在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码:
buildScript {
repositories {
mavenCentral()
}
}
repositories {
mavenCentral()
}
buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等。而在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。
buildscript代码块中的repositories和dependencies的使用方式与直接在build.gradle文件中的使用方式几乎完全一样。唯一不同之处是在buildscript代码块中你可以对dependencies使用classpath声明。该classpath声明说明了在执行其余的build脚本时,class loader可以使用这些你提供的依赖项。这也正是我们使用buildscript代码块的目的。