要学习一些基本的Vim使用操作,可以运行vimtutor(控制台版本)或gvimtutor(图形界面版本)阅读Vim教程。Vim包含了一个广泛的帮助系统,可以用:h _subject_命令来访问。_subject_主题可以是命令,配置选项,热键绑定,插件等。使用:h命令(不带任何subject)来获取帮助系统的相关信息以及在不同的主题之间切换。
安装下面两个软件包中的一个:vim — 提供Python 2/3, Lua, Ruby 和 Perl 解释器支持,但没有 GTK/X 支持gvim — 除了提供和vim一样的功能外,还提供了图像界面。注意:vim包不包含 Xorg 支持。因此Vim缺失了 +clipboard 特性,Vim也就不能够同X11的 primary 和 clipboard 剪切板交互。gvim包在全面支持图形界面的同时提供了命令行版本带+clipboard的Vim。
Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的可视化模式。Vim 专注于键盘操作,它并不是像 nano 或 pico 一样的简单编辑器。Vim 需要花时间来学习,并值得花上更多的时间来掌握。
作为一个Java开发者,你有很多个测试框架可选,这一节我将介绍传统的JUnit和TestNG,如果你没有接触过这些框架,你可以先看看他们的在线文档。使用JUnit你将给你之前的ToDo应用的存储类InMemoryToDoRepository.java编写单元测试,为了突出不同框架的相同和不同之处,所有的单元测试都会验证同一个类的功能。
一些开源的测试框架比如JUnit,TestNG能够帮助你编写可复用的结构化的测试,为了运行这些测试,你要先编译它们,就像编译源代码一样。测试代码的作用仅仅用于测试的情况,你可不想把你的测试代码发布到生产环境中,把源代码和测试代码混在一起可不是个好主意。通常你会把源代码和测试代码分开来,比如Gradle的标准项目布局src/main/java和src/test/java。
如果你想构建可靠的高质量的软件,自动化测试将是你工具箱里面非常关键的一个部分,它帮助你减少手工测试的代价,提高你的开发小组重构已有代码的能力。自动化测试的类型 并非所有的自动化测试都是相似的,他们通常在作用域、实现方式和执行时间上有所差异,我把他们分成三种类型的测试:单元测试、集成测试和功能测试。
在之前的章节我们实现了一个简单但是功能齐全的web项目、学习了如何使用Gradle来构建和运行这个项目。测试代码是软件开发周期中非常重要的一环,能够确保软件的行为能符合预期。这一章我将讲述如何使用Gradle来组织、配置和执行测试代码,学习如何写单元测试、集成测试和功能测试并把他们集成到项目构建中。
Gradle构建脚本的标准名称是build.gradle,在一个多项目构建的环境中,你想自定义你的构建脚本名称来显得高大上一点,因为多个项目有相同的构建脚本名称可能会混淆,接下来介绍如何使用自定义的脚本名称。
到目前为止我们自定义了一个build.gradle和settings.gradle文件,随着你添加越来越多的子项目和任务到build.gradle中,代码的维护性将会下降。通过给每个子项目建立一个单独的build.gradle文件可以解决这个问题。接下来我们在每个子项目的目录下创建一个build.gradle文件,目录如下:现在你可以把构建逻辑从原先的build脚本中拆分开来放到合适的位置。
到目前为止你已经把ToDo项目根据功能拆分成多个模块,接下来可以用之前的方法来定义构建逻辑,下面有几点需要主要:根目录和子目录使用相同的group和version属性值所有的子目录都是Java项目需要Java插件来正常工作,所以你只需要在子项目中应用Java插件web子项目是唯一一个依赖外部库的项目,它需要打包成WAR而不是JAR子项目之间可以定义模块依赖接下来你将学习如何定义…
上一节你给你的项目定义了一个层次化的目录结构,整个项目包含一个根目录和每个模块一个子目录,这一节你将学习怎么用Gradle来构建这样一个项目结构。首先在你的根目录新建一个build.
在企业项目中,包层次和类关系比较负责,把代码拆分成模块是一个比较困难的任务,因为这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。解耦和聚合但你的项目符合高内聚低耦合时,模块化就变得很容易,这是一条非常好的软件开发实践。
每一个活跃的项目会随着时间慢慢增长的,一开始可能只是个很小的项目到后面可能包含很多包和类。为了提高可维护性和解藕的目的,你可能想把项目根据逻辑和功能来划分成一个个模块。模块通常按照等级来组织,相互之间可以定义依赖。Gradle给项目模块化提供了强大的支持,在Gradle中每个模块都是一个项目,我们称之为多项目构建,这一章介绍Gradle的多项目构建。
Gradle支持下面三种不同类型的仓库:下图是配置不同仓库对应的Gradle API:下面以Maven仓库来介绍,Maven仓库是Java项目中使用最为广泛的一个仓库,库文件一般是以JAR文件的形式存在,用XML(POM文件)来来描述库的元数据和它的传递依赖。所有的库文件都存储在仓库的指定位置,当你在构建脚本中声明了依赖时,这些属性用来找到库文件在仓库中的准确位置。
DSL配置block dependencies用来给配置添加一个或多个依赖,你的项目不仅可以添加外部依赖,下面这张表显示了Gradle支持的各种不同类型的依赖。这一章直接扫外部模块依赖和文件依赖,我们来看看Gradle APi是怎么表示依赖的。
在前面我们学习了怎么使用Jetty插件来使用自带的Jetty容器来部署一个TODo应用,Jetty是一个轻量级的开发容器,启动非常快。很多企业级的应用都使用其他的Web容器来部署应用,假设你使用的是Apache Tomcat。
几乎所有基于JVM的项目都会或多或少依赖其他库,假设你在开发一个基于web的项目,你很可能会依赖很受欢迎的开源框架比如Spring MVC来提高效率。Java的第三方库一般以JAR文件的形式存在,一般用库名加版本号来标识。随着开发的进行依赖的第三方库增多小的项目变的越来越大,组织和管理你的JAR文件就很关键。
在第三章我们在构建To Do应用的时候学习到了怎么声明对Servlet ApI的依赖,Gradle的领域特定语言使得声明依赖和仓库变得很简单,你只需要在dependencies脚本中声明你所依赖的库,然后你需要告诉构建系统要从哪个仓库里下载依赖。提供了这两个信息,Gradle就能自动解析、下载依赖到你的电脑上,如果有需要会存储在本地缓存中必备以后需要。
作为一个构建脚本的开发者,你不应该局限于编写任务动作或者配置逻辑,有时候你想在指定的生命周期事件发生的时候执行一段代码。生命周期事件可以在指定的生命周期之前、之中或者之后发生,在执行阶段之后发生的生命周期事件就该是构建的完成了。
每个新创建的任务都是org.gradle.api.DefaultTask类型,org.gradle.api.Task的标准实现,DefaultTask所有的域都是私有的,意味着他们只能通过setter和getter方法来访问,庆幸的是Groovy提供了一些语法糖来允许你通过名字来使用域。
关注时代Java