Gradle使用记录

  1. Gradle 安装

下载地址:https://services.gradle.org/distributions/

要根据开发工具选择对应版本,例如idea 2018,gradle只能选择5.7以下版本

 

配置环境变量

新建环境变量 GRADLE_HOME,即E:\dev\gradle-5.6.4

Gradle使用记录_第1张图片

 

修改环境变量 Path,即追加 %GRADLE_HOME%\bin

Gradle使用记录_第2张图片

 

设置本地仓库目录

GRADLE_USER_HOME=D:\gradle\repo

如果不设置本地仓库目录,idea命令行使用gradle命令时会重新下载依赖到系统用户目录下的.gradle

验证:

gradle -v

Gradle使用记录_第3张图片

 

Idea配置gradle

Gradle使用记录_第4张图片

 

​​​​​​​仓库下载地址全局配置

在gradle安装目录下的init.d目录下创建init.gradle

E:\dev\gradle-5.6.4\init.d

Gradle使用记录_第5张图片

 

添加全局仓库配置后,在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

Gradle使用记录_第6张图片

 

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命令

Gradle使用记录_第7张图片

 

命令行方式:

//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配置文件中添加以上配置

Gradle使用记录_第8张图片

 

子模块打jar包公共配置,在父build.gradle中添加

jar { enabled = true}

Gradle使用记录_第9张图片

 

参考:

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

  1. 确认idea安装了lombok插件
  2. Gradle配置文件添加如下配置

// 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即可。

Gradle使用记录_第10张图片

 

​​​​​​​3.3 Idea 无法启动gradle项目

检查build tools>Gradle>Runner

Delegate IDE有没有打勾,有打勾去掉,就可以正常启动项目

Gradle使用记录_第11张图片

 

​​​​​​​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代码块的目的。

 

 

 

 

 

你可能感兴趣的:(springboot,gradle)