更新中…
什么是Gradle?
gradle(一种强大的项目构建工具)
软件项目构建:Java中常用的是Ant、Maven(Maven相对于Ant拥有强大的依赖配置)
·Gradle是个构建系统,能够简化你的编译、打包、测试过程。(类比于Java中的Maven)
·Gradle Wrapper的作用是简化Gradle本身的安装、部署。(因为不同版本的项目可能需要不同版本的Gradle,手工部署比较按麻烦,而且可能产生冲突,所以需要Gradle Wrapper来搞定这些事情,当部署项目的时候,其会根据gradle-properties中的配置文件进行对应版本的下载配置以及对应版本的gradle下载位置)
为什么是Gradle而不是Maven?
·Gradle与Maven之间的区别(最大的不同就是Gradle比Maven灵活。体现在Maven在构建的时候每一步都依赖前面一个环节:编译、测试、发布等;以及maven在配置文件方面使用的是XML文件:格式过于冗长;Gradle可以扩展,可以将Gradle配置文件和XML文件进行转换,以及可以使用Maven的仓库即可以与其它构建工具进行集成等等这些区别)
·掌握gradle如下命令的使用:clean、build、打印依赖树、war
gradle clean (删除build目录)
gradle build (构建并单元测试)
gradle dependencies (列出所选项目的依赖列表)
gradle buildEnvironment (列出build脚本的依赖列表)
gradle dependencyInsight (根据指定的输入来输出特定的依赖选项)
war包:Java web项目打包后生成的文件,打包后的war包可用于分发给tomcat服务器
Gradle如何使用?
·->.\gradlew build --scan(构建审视)
build scan是一个可分享的构建过程的信息集合,通过build scan可以观察到构建过程中发生了什么以及为什么
相关配置:在build.gralde中添加
plugins { //使build scans能够记录项目的所有构建信息
id 'com.gradle.build-scan' version '2.1'
} //其中,版本号建议设为最新
buildScan { //接受许可信息,从而可以允许你配置plugin块
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
termsOfServiceAgree = 'yes'
}
发布build scan: .\gradlew build --scan(发布成功后进入提供的链接,填写邮箱进行查看)
创建一个初始化脚本可以为所有的构建生成build scan (文档中是在根目录下的.gradle文件夹中生成的脚本,Linux系统下执行gradlew命令可能会自动调用该脚本从而自动生成build scan,但是在win10环境下,该怎么自动调用buildScan.gradle脚本文件?)
->问题解决:win10环境下,home目录在C盘用户文件夹下的个人用户账号文件夹下,在哪里你可以发现.gradle文件夹,按照上面的步骤进行操作即可。
->生成buildScan.gradle文件之后,若要查看build scan,只需执行.\gradlew --scan之后就能成功生成build scan
总结:
生成build scan
在线查看build scan信息
创建一个初始化脚本可以为所有的构建生成build scan
·->.\创建新的gradle构建项目
新建一个文件夹,在该文件目录下:gradle init完成gradle构建项目初始化
gradle提供接口用来创建和配置task
gradle应用插件和task进行配合使用
.\gradlew task --scan (执行指定任务时 可以直接生成该任务的build scan)
也可以通过.\gradlew properties 查看配置信息
总结:
生成build scan
在线查看build scan信息
创建一个初始化脚本可以为所有的构建生成build scan
·->.\创建一个多应用的项目(根项目下包含多个子项目)
添加一个Java应用子项目
确保某个子项目下的test能够自己正常工作:
根据test中要使用的编码内容,来确定子项目下的build.gradle中的配置信息(包括插件plugins、依赖dependencies)
代替重新构建整个项目的方法是单独运行该test程序:.\gradlew :greeter:test (因为gradlew只存在在根目录,为了不上寻目录,可以使用 :greeter:test的方法来执行该test)
添加文档(使用比较热门的Asciidoctor tool):
root项目下的build.gradle中添加:
plugins {
id 'org.asciidoctor.convert' version '1.5.6' apply false
} //其中apply false表示向所有子项目添加该插件除了root项目
在顶层文件夹下新建一个子项目docs,并在docs下新建gradle script:build.gradle
plugins {
id 'org.asciidoctor.convert'
}
asciidoctor {
sources {
include 'greeter.adoc'
}
}
build.dependsOn 'asciidoctor'
在root项目中的settings.gradle中更改配置,使其包含子项目docs: include 'docs'
在docs/src/docs/asciidoc/greeter.adoc中添加内容(有特定语法格式)
执行.\gradlew asciidoctor后即可看到相关html文档
总结:
·->.\构建Java库
通过命令:gradle init --type java-library(初始化gradle构建java-library项目,可供选择的项由basic、cpp-application、cpp-library、groovy-application、groovy-application、groovy-library、java-application、java-library、kotlin-application、kotlin-library、scala-library)
初始化java-library项目之后,执行命令.\gradlew build即可构建完成项目(可以在build/reports/tests/test/index.html文件中查看构建过程的日志)
对构建java-library后生成的jar包进行测试 (jar tf build/libs/building-java-libraries.jar)
配置build.gradle:在其中添加version = '0.1.0',运行jar task: .\gradlew jar (在build/libs中生成了0.1.0版本的该项目的jar包)
修改META-INF/MANIFEST.MF中的默认信息:
配置build.gradle:
jar {
manifest {
attributes('Implementation-Title': project.name,
'Implementation-Version': project.version)
}
}
.\gradlew jar重新执行jar task
jar xf build/libs/building-java-libraries-0.1.0.jar META-INF/MANIFEST.MF
执行.\gradlew javadoc后在build/docs/javadoc/index.xml中查看文档
总结:
META-INF/MANIFEST.MF(清单文件关于JAR包的描述信息、启动时的配置信息和安全性信息等均保存在其中,可以理解为jar的一个'配置文件')
·->.\构建Java应用
同构建Java库
.\gradlew tasks 可以列出tasks(其中有一个run task)
.\gradlew run 即可运行main中的APP
总结:
·->.\构建Java Web应用
手动新建一个树形文件目录:
webdemo/
src/
main/
java/
webapp/
test
java/
在根目录下生成gradle wrapper: gradle wrapper --gradle-version=**.**.**(需要注意版本,要到官网去查看版本是否填写正确,否则会始终报错,到你怀疑人生的那种)
总结:
遇到的注解:
通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了(对于有多个Bean时这样用,即可消除歧义)
注解里的参数必须时常数(constant)
常数必须要有初始值
@JsonIgnoreProperties注解:
放在类上面,作用是忽略类中不存在的字段当接收的时候
@JsonProperty注解:
放在字段上面,作用是与前端返回的字段进行映射(注解里的属性值是前端返回的字段值)
@Transactional(rollbackFor = Exception.class)
异常:
可查的异常:Exception下除了RuntimeException之外的异常 Java编译器要求必须对其进行捕获
不可查异常:RuntimeException及其子类和错误Error
@Transactional的写法:
Spring框架的事务基础架构代码将 默认 地只在抛出运行时和unchecked exceptions时才标识事务回滚
->让checked例外也进行回滚:@Transactional(rollbackFor = Exception.class)
->让unchecked例外不回滚:@Transactional(notRollbackFor = RunTimeException.class)
->不需要事务管理的(只查询的)方法:@Transactional(propagation = Propagation.NOT_SUPPORTED)
注:若异常被try{} catch {}了,事务就不回滚了,若想让事务回滚必须再往外抛try{} catch{throw Exception}
@RequestBody: 可以解析请求数据body中的json格式数据
@Data:注解在类上,为类提供读写属性,此外还提供了equals()、hashCode()、toString()方法
@TableName("***"):在实体类上,用于自动匹配实体类对应的表
@JsonIgnoreProperties(ignoreUnknown = true):用于实体类,忽略类中不存在的字段当接收的时候
@TableId(type = IdType.AUTO):实体类主键策略,在实体类中的属性上增加注解即可
@TableField(value = "createTime"):即数据表中的字段名与实体类中的属性进行映射,并且还有其他功能:
@TableField(exist = false): 表示该属性不为数据库表字段,但又是必须使用的
@TableField(exist = true):表示该属性为数据库表字段
@TableField(condition = SqlCondition.LIKE):表示该属性可以模糊搜索
@TableField(fill = FieldFill.INSERT):注解填充字段,生成器策略部分也可以配置
@NotNull:被注释的元素不能为null
@Slf4j:注解在类上,为类提供了属性名为log的log4j的日志对象
@Log4j:注解在类上,为类提供了属性名为log的log4j的日志对象
@PostMapping:映射一个POST请求
@GetMapping:映射一个GET请求
@DeleteMapping:映射一个DELET请求
@EqualsAndHashCode:
此注解会生成equals(Object other) 和hashCode()方法
默认使用非静态,非瞬间的属性
可通过参数exclude排除一些属性
可通过参数of指定仅使用那些属性
它默认仅使用该类中定义的属性且不调用父类的方法
在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解
Controller、Service、DAO项目构建示例
DAO:
updater varchar 128 COMMENT '更新人' #更新人则是必须进行校验的字段,每次更改,都会获取当前用户信息,与数据库不符就更新否则不操作
descriptor text 0 COMMENT '集群描述信息' #描述信息是可以选择填写的,如果前端传来这个字段,就写入数据库
@Insert("INSERT INTO ... (..., `updater`, `descriptor`) VALUES (..., #{item.userNumber}, #{descriptor}) ") #accountService.getLoginUserNumber()
void addYarnCluster(@Param("item") YarnCluster yarnCluster);
@Update("UPDATE etl_yarn_cluster SET yarnName = #{item.yarnName}, ... , #{item.updater}, #{item.descriptor}"
+ " WHERE ...")
void updateYarnCluster(@Param("item") YarnCluster yarnCluster);
class YarnCluster {
...
private String descriptor;
}
Service:
Service层过于简单,也不用动(我jio得Controller层的业务逻辑应该移到Service)
Controller: //Controller层可以不用动
@RequestMapping("addYarnCluster"))
public CommonVO<Boolean> addYarnCluster(@RequestBody String jsonStr) {
}
xxxService extends IService<T>
xxxServiceImpl extends ServiceImpl<M extends com.baomidou.mybatisplus.mapper.BaseMapper<T>, T>
xxxMapper extends BaseMapper<T>
组装查询条件:
Wrapper:
Wrapper<T> entityWrapper = new EntityWrapper<>();
Wrapper<T> where(boolean condition, String sqlWhere, Object... params); (ew.where("name='zhangsan'").where("id={0}", "123");)
Wrapper<T> eq(boolean condition, String column, Object params); (等同于SQL的"field=value"的表达式)
Wrapper<T> ne(boolean condition, String column, Object params); (等同于SQL的"field<>value"的表达式)
Wrapper<T> and(boolean condition, String sqlAnd, Object... params); (ew.where("name='zhangsan'").and("id=11").andNew("statu=1")输出WHERE (name='zhangsan' AND id=11) AND (statu=1))
Wrapper<T> like(boolean condition, String column, String value); (LIKE条件语句,value中无需前后%)
T getEntity();
void setEntity(T entity);
ServiceImpl:
Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@EqualsAndHashCode(callSuper = true)
public class ReqRequirementQuery extends BaseQuery implements Serializable {
//当前用户
private String userNumber;
//需求标题 模糊搜索
private String requirementTitle;
//需求topic 模糊搜素
private String topic;
//需求状态
private int requirementStatus;
//需求信息
private String updater;
}
打印日志层级:[ALL < TRACE <] DEBUG < INFO < WARN < ERROR [< FATAL < OFF](如果将log level设置在某个级别上,则比此级别优先级高的log都能打印出来)
异常:Exception和Throwable之间的区别
catch throwable会把Error和其他继承Throwable的类捕捉到;catch Exception只会捕捉Exception及其子类,捕捉的范围更小
更多Spring Boot实例请参考 @程序猿DD