🐇Gradle
Gradle Wrapper实际上就是一个脚本,使用它可以下载和使用指定版本的gradle,根据需要进行在使用之前进行下载,有效避免本地机器的设定等环境一致性问题。
虽然gradle的安装已经非常简单,但是使用gradle wrapper是的开发这能够以一种更为标准化的方式创建gradle项目。
每一个用gradle编译的工程,都会有一个gradle/wrapper
目录,目录下的两个文件:
gradle-wrapper.jar
:用于下载Gradle的相关代码实现
gradle-wrapper.properties
:wrapper所使用的配置信息,比如gradle的版本等信息
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionBase
和distributionPath
组合在一起,是解压gradle-4.8.1-bin.zip之后的文件的存放位置。distributionPath
是distributionBase
指定的目录下的子目录。
下载位置可以和解压位置不一样。
zipStoreBase
和distributionBase
有两种取值:GRADLE_USER_HOME
和PROJECT
。
其中,GRADLE_USER_HOME
表示用户目录。
在Windows下是%USERPROFILE%/.gradle
,例如C:\Users\<user_name>\.gradle\
。
在Linux下是$HOME/.gradle
,例如~/.gradle
。
PROJECT
表示工程的当前目录,即gradlew
所在的目录。
各种属性的具体含义如下:
- 去
https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
下载gradle的4.8.1版本 - 下载的gradle-4.8.1-bin.zip存放到
C:\Users\<user_name>\.gradle\wrapper\dists
目录中
(注:具体还有2级目录,即全路径为C:\Users\<user_name>\.gradle\wrapper\dists\gradle-3.1-bin\<url-hash>\
,gradle-3.1-bin目录是根据下载的gradle的文件名来定的,目录名是根据distribution url路径字符串计算md5值得来的,具体参考PathAssembler.java中的rootDirName()和getHash(),PathAssembler.java的位置见本文最后的参考路径) - 解压gradle-4.8.1-bin.zip,将解压后的文件存放到
C:\Users\<user_name>\.gradle\wrapper\dists
中(注:具体还有2级目录,同上)
🐇build.gradle
buildscript {
//ext用于定义属性
ext {
springBootVersion = '1.5.10.RELEASE'
}
//使用了Maven的中央仓库(也可指定其他仓库)
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
//依赖关系
dependencies {
//classpath 声明在执行其它脚本时ClassLoader可以使用这些依赖库
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
//使用插件
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
group = 'com.zmh'
version = '0.0.1'
//指定编译.java文件的JDK版本
sourceCompatibility = 1.8
//默认使用Maven的中央仓库,此处改用自定义的镜像库
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
//configurations是依赖集合,可为工程声明额外依赖
configurations {
providedRuntime
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
//数据库相关
compile('mysql:mysql-connector-java')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
//友好的HTML规范 搭配spring.thymeleaf.mode=LEGACYHTML5
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('net.sourceforge.nekohtml:nekohtml:1.9.22')
//热部署 搭配spring.thymeleaf.cache=false
compile('org.springframework.boot:spring-boot-devtools')
//SpringBoot内置的Redis
compile('org.springframework.boot:spring-boot-starter-data-redis')
//内置tomcat 仅开发测试用
//runtime('org.springframework.boot:spring-boot-starter-tomcat')
//spring-boot-admin 图形化管理页面
compile('de.codecentric:spring-boot-admin-server:1.5.7')
compile('de.codecentric:spring-boot-admin-server-ui:1.5.7')
compile('de.codecentric:spring-boot-admin-starter-client:1.5.7')
//pagehelper
compile group: 'com.github.pagehelper', name: 'pagehelper-spring-boot-starter', version: '1.2.3'
//使用的是shiro-spring 而非shiro
compile('org.apache.shiro:shiro-spring:1.4.0')
compile('com.github.theborakompanioni:thymeleaf-extras-shiro:1.2.1')
//测试
testCompile('org.springframework.boot:spring-boot-starter-test')
}
🐇gradlew.bat
针对Windows的shell脚本与批处理命令,当项目被push到远程后,其他用户使用Git克隆下来,只需在本地执行./gradlew
即可进行项目的构建与任务的执行,同时用户本机并不需要提前安装好Gradle分发包.
🚢代码分析
controller–>service–>mapper
- AdminController
在页面标签栏里显示日志文件
package com.dwz.xietongoa.controller;
import com.dwz.xietongoa.dto.ReturnDto;
import com.dwz.xietongoa.util.ReadFileUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author DWZ
* @date 2020/4/18 16:24
* 在页面标签栏里显示日志文件
*/
@Controller
@RequestMapping(value = "/admin")
public class AdminController {
//这两个参数从application.properties获取
@Value("${logback.filepath}")
private String filePath;
@Value("${logback.charset}")
private String charSet;
/**
* 获取所有日志文件的文件名
* @return
*/
@RequestMapping(value = "/getFileNames")
@ResponseBody
public ReturnDto getFileNames(){
return ReadFileUtil.