项目搭建

在这里插入图片描述

选择gradle和jar包方式创建
在这里插入图片描述
选择需要的依赖引入
在这里插入图片描述
完成后的目录结构

配置

完成后需要对build.gradle文件进行配置

//引入的插件
plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
//设置编码格式
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

group = 'com.example'
version = '0.0.1'
//编译后的.class文件的jdk版本
sourceCompatibility = '11'
//项目运行版本
targetCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
//远程仓库,可以修改成阿里的仓库
repositories {
maven { url "https://maven.aliyun.com/repository/public/" }
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
    implementation group: 'com.alibaba', name: 'druid-spring-boot-starter', version: '1.2.4'
    // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
//拷贝发布的docker jar包
task copyDockerJar(type: Copy) {
    from "build/libs/${rootProject.name}-${project.version}.jar"
    into 'src/main/docker'
}



bootJar {
    dependsOn copyDockerJar
}

test {
    useJUnitPlatform()
}

implementation 和compile 以及api的区别:

  1. compile旧的关键字,不推荐使用
  2. api和compile作用相同,支持依赖传递
  3. implementation 不支持依赖传递,只能在当前模块中使用
task的使用
什么是Task

Task实际就是一连串的操作,最后得到我们需要的内容。

我们可以这么理解,Gradle是一个大的舞台,这个舞台提供了基础的能力。不同插件(java Pluging、android pluging)是不同的表演团队,提供不同的表演。这个表演就是Task。不同的Task完成不同的任务,我们根据不同的需求选择不同的Task。如果在开发中,发现系统插件给我的Task不能满足需求怎么办呢?我们也可以根据规则,编写一个属于我们自己的Task。

所以综合一下,Task分成了两种,一种是Pluging提供的,另外一种是开发者自定义的。

查看项目的Tasks

我们打开android studio,再最右边的便签栏可以打开当前项目的所有的task。我们接着打开build标签,我们发现了之前的任务。我们可以尝试点击一下执行相关的任务。发现和我们在命令行执行的效果是一样的。除了使用IDE查看任务外,我们也可以使用命令来查看当前项目的任务。

./gradlew tasks

如果想看个个任务的详细信息

./gradlew tasks --all

详细信息里面多了很多内容,比如说项目的依赖等信息。

我们发现这些Task很多类似名称的Task,这个是插件为我们提供的任务。

  1. assemble 组合项目的输出,在java中多用于生成jar、war包,而在android中用于生成apk
  2. check 用户项目的检查任务,比如说lint
  3. connectedCheck 用于连接设备的检查
  4. build 这种任务会执行assemble与check的任务
  5. clean 这个task清空项目的所有输出。
定义Task

我们学会了查看当前项目的任务,我们来看看如何定义一个Task,及task的使用。

task myTask { configure closure }
task myTask(type: SomeType) { configure closure }

上面是task的两种定义方式,第一种是直接定义一个task,第二种是让这个task继承于某类的task,可以理解为继承。

直接定义Task
我们可以在脚本的任意位置添加以下的代码

task showMeTheMoney{
    println("show me the money");
}

接着我们在终端的界面输入下面的命令

 ./gradlew showMeTheMoney

使用某种type来定义Task

task myCopy(type:Copy){
        from './build/outputs/apk/app-noLog-free-release.apk'
        into './test/'
   }

接着我们在终端的界面输入下面的命令(注意你的目录可能和我的不一样,替换成你自己的目录)

 ./gradlew myCopy 

上面的这个任务继承于Copy。

这个是Copy的所有属性,https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Copy.html

除了Copy以外我们还有什么类型呢?

https://docs.gradle.org/current/userguide/java_plugin.html,我们可以参考Java插件的类型

doFirst 与 doLast
  1. doFirst:task执行时,最开始的操作
  2. doLast:task执行时,最后的操作

注意如果有比较旧的项目,你会看到这样的写法

task showArgs << {
    println "Hello World"
}

在这里<<就是doLast的缩写,注意新的版本gradle已经建议不要这么写了。

dependsOn 依赖关系

项目中可能会存在各种依赖,比如A依赖B,这时候使用dependsOn 来解决这种情况,但是需要注意一点dependsOn后面依赖的任务需要在当前任务的前面,否则可能找不到任务而报错

task copyDockerJar(type: Copy) {
    from "build/libs/${rootProject.name}-${project.version}.jar"
    into 'src/main/docker'
}

bootJar {
    dependsOn copyDockerJar
    }

还有一种写法,这种可以不分顺序

task A(dependsOn:'B'){

    doFirst{
         println("this is A")
    }
    }
task B{
    doFirst{
        println("this is B")
    }
}
bootJar

当bootJar启用的时候jar默认是失效的。

通过bootJar对jar文件瘦身
// 将依赖包复制到lib目录
task copyJar(type: Copy) {
    // 清除现有的lib目录
    delete "$buildDir\\libs\\lib"
    //需要复制的文件
    from configurations.runtime
    //复制到的目标文件夹
    into "$buildDir\\libs\\lib"
    from configurations.compileClasspath
    into "$buildDir\\libs\\lib"
}

// 拷贝配置文件
task copyConfigFile(type: Copy) {
    // 清除现有的配置目录
    delete "$buildDir\\libs\\config"
    from('src/main/resources')
    into 'build/libs/config'
}

bootJar {
    // 例外所有的jar
    excludes = ["*.jar"]
    // lib目录的清除和复制任务
    dependsOn copyJar
    dependsOn copyConfigFile
    // 指定依赖包的路径
    manifest {
        attributes "Manifest-Version": 1.0,
                'Class-Path': project.configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
    }
}

参考文章:https://blog.csdn.net/seemygoandroid/article/details/76125299
Gradle文档资料地址 https://gradle.org/docs

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐