开启第一个Spring Boot项目
按照SpringBoot带给人们简化企业级应用开发的承诺,本节将演示如何开启第一一个SpringBoot项目。创建Spring Boot应用的过程非常简单,甚至开发人员不需要输入任何代码,就能完成一个Spring Boot项目的构建。
配置环境
为了演示本例子,需要采用如下开发环境。
●JDK8。
Gradle 4.0。
其中,JDK的安装和Gradle的安装可以参阅2.4节的内容。
检查JDK版本情况,确保不低于Java 8版本。
$ java -versionjava version "1.8.0 112"Java (TM) SE Runtime Environment (build 1.8.0 112-b15)Java HotSpot (TM) 64-Bit Server VM (build 25.112-b15, mixed mode )
检查Gradle版本情况。
$ gradle -vGradle 4.0Build time: 2017-06-14 15:11 :08 UTCRevision: 31 654 6a5 fcb4e2dfe1d6aa0b73a4e09e8cecb5a5Groovy: 2.4.11Ant: Apache Ant (TM) version 1.9.6 compiled on June 29 2015JVM: 1.8.0 112 (Oracle Corporation 25.112-b15)OS : Windows 10 10.0 amd64
通过Spring Initializr初始化一个Spring Boot原型
Spring Initializr 是用于初始化Spring Boot项目的可视化平台。虽然通过Maven或Gradle来添加Spring Boot提供的Starter 使用起来非常简单,但是由于组件和关联部分众多,有这样-一个可视化的配置构建管理平台对于用户来说非常友好。下 面将演示如何通过Spring Initializr 初始化-一个Spring Boot项目原型。
访问网站hts://sart.spring.io/, 该网站是Spring 提供的官方Spring Initializr 网站,当然,也可以搭建自己的Spring Initializr 平台,有兴趣的读者可以访问htst:ithbroo/prig i/nitilizx/来获取Spring Initializr项目源码。
按照Spring Initalizr页面提示,输入相应的项目元数据( Project Metadata )资料并选择依赖。
由于我们是要初始化一一个Web项目,所以在依赖搜索框中输入关键字“web” ,并且选择“Web:-Full-stack web development with Tomcat and Spring MVC"选项。顾名思义,该项目将会采用SpringMVC作为MVC的框架,并且集成了Tomcat作为内嵌的Web容器。图2-2展示了Spring Initializr的管理界面。
这里我们采用Gradle作为项目管理工具,Spring Boot版本选型为2.0.0.M4,Group 的信息填为“com.waylau.springcloud” , Artifact 填为“ializ-start” 。最后,单击“Generate Project"按钮,此时,可以下载到以项目“initializr-start” 命名的zip包。该压缩包包含了这个原型项目的所有源码及配置,将该压缩包解压后,就能获得initializr -start项目的完整源码。
这里我们并没有输入任何代码,却已经完成了一个完整Spring Boot项目的搭建。
用Gradle编译项目
切换到initializr-start项目的根目录下,执行gradle build来对项目进行构建,构建过程如下。
$ gradle buildStarting a Gradle Daemon, 1 busy Daemon could not be reused, use --statusfor detailsDownload https:/ / repo. spring. io/mi lestone/org/ springframework/boot/spring-boot-gradle-plugin/2.0.0.M4/spring-boot-grad1e-p1ugin-2.0.0.M4.pomDownload https:/ /repo. spring. io/milestone/ org/ springf ramework/boot/spring-boot-tools/2.0.0.M4/ spring-boot-tools-2.0.0.M4. pomDownload https:/ / repo. spring. io/milestone/org/ springframework/boot/spring-boot-parent/2.0.0.M4/ spring -boot- -parent-2.0.0.M4.pom Download https:/ / repo. spring. io/milestone/org/ springfr amework/boot/spr ing-boot-dependencies/2.0.0.M4/spring-boot-dependencies-2.0.0.M4. pomDownload https:// repo1.maven. org/maven2/com/ fasterxml/ jackson/ jackson-bom/2.9. 1/jackson-bom-2.9.1.pomDownload https:// repol .maven. org/maven2/com/ fasterxml/j ackson/ jackson-parent/2.9.1/ jackson-parent-2.9.1. pomDownload https:// repo1.maven . org/maven2/ com/ fasterxml/oss-parent/30/oss-parent-30. pomDownload https://repo1 .maven. org/maven2/ io/netty/netty-bom/4.1.15.Final/netty-bom-4.1.15. Final. pomDownload https:// repo. spring. io/milestone/ io/projectreactor/ reactor-bom/Bi smuth- -M4/ reactor-bom- Bi smuth-M4. pom Download https://repo1 .maven. org/maven2/org/apache/ logging/1og4j/1og4j-bom/2.9.0/1og4j-bom-2.9.0. pomDownload https:// repo.spring.io/milestone/org/springframework/ spring-framework-bom/5.0.0. RC4/ spring- framework-bom-5.0.0. RC4.pomDownload https://repo.spring. io/milestone/org/ springframework/data/spring-data-releasetrain/Kay-RC3/ spring-data-releasetrain-Kay-RC3. pomTask :test2017-09-26 23:30:53.234 INFO 2604 --- [Thread-5] o.s.w.c.s. Gener i cWebAppl icationContextClosing org. spr ingfr amework.web. context. support. Generi cWebApplicationContext@75bb1267: startup date [Tue Sep 26 23:30:51 CST 2017]; root of context hierarchyBUILD SUCCESSFUL in 5m 5s5 actionable tasks: 5 executed
我们来分析一下执行gradle build的整个过程发生了什么。
首先,在编译开始阶段, Gradle 会解析项目配置文件,而后去Maven仓库找相关的依赖,并下载到本地。速度快慢取决于本地的网络。控制台会打印整个下载、编译、测试的过程,当然,这里为了节省篇幅,省去了大部分的下载过程。最后,显示“BUILD SUCCESSFUL"的字样,说明已经编译成功了。
我们回到项目的根目录下,可以发现多出了一个build 目录,在该目录buildlibs'下可以看到-一个iniliz-start-0.0.1-SNAPSHOTjar,该文件就是项目编译后的可执行文件。在项目的根目录,通过下面的命令来运行该文件。
java -jar build/libs/ initializr-start-0.0.1-SNAPSHOT.jar
成功运行后,可以在控制台看到如下输出。
$ java -jar build/libs/initializr-start-0.0.1-SNAPSHOT.jar
2017-09-26 23:34:35. 961INFO 776 --- [main] C.w.s.c.i. InitializrStartApplication: Starting InitializrStartAppl ication on AGOC3- 705091335 with PID 776 (D: workspaceGitosc spring-cloud -microservices-development samples initial izr-start buildlibsinitializr-start-0.0.1-SNAPSHOT.jar started by Administrator in D: workspaceGitoscspring-cloud-microservices-development samplesinitializr-start)2017-06-30 00:55:27.874INFO 11468 --- [main] o.s.b.w. embedded.tomcat . TomcatWebServer : Tomcat started on Port(s) : 8080(http)2017-06-30 00:55:27.874INFO 11468 --- [main]c.w.s.b.b.i. Initial izrStartApplicationStarted InitializrStartApplication in 4.27 seconds (JVM running for 5.934)
我们可以观察一-下控制台输出的内容(为了节省篇幅,省去了中间大部分内容)。在开始部分,是一个大大的“Spring” 的横幅,并在下面标明了Spring Boot的版本号。该横幅也称为Spring Boot的“banner”
用户可以根据自己的个性需求来自定义banner。 例如,在类路径下添加一个banner.txt文件,或者通过将banner.location设置到此类文件的位置来更改。如果文件有一个不寻常的编码,也可以设置banner.charset (默认是UTF-8)。除了文本文件,还可以将banner.gif、banner.jpg 或banner.
png图像文件添加到类路径中,或者设置banner. image.location属性。这些图像将被转换成ASCII艺术表现,并打印在控制台上方。
Spring Boot默认寻找Banner的顺序如下。
●依次在类路径下找文件banner.gif、 banner.jpg或banner.png, 先找到哪个就用哪个。
●继续在类路径 下找banner.txt。
●上面都没有找到的话,用默认的Spring Boot Banner, 就是在上面控制台输出的最常见的那个。
从最后的输出内容可以观察到,该项目使用的是Tomcat容器,项目使用的端口号是8080。
在控制台输入“Ctrl +C",可以关闭该程序。
探索项目
在启动项目后,在浏览器里面输入“ttp:/ocalhost:8080/” ,我们可以得到如下信息。
Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeingthis as a fallback.Tue Sep 26 23:52:05 CST 2017There was an unexpected error (type=Not Found, status=404) .No message available
由于在我们项目里面,还没有任何对请求的处理程序,所以Spring Boot会返回上述默认的错误提示信息。
我们观察一下initializr start项目的目录结构。
1. build.gradle文件
在项目的根目录,我们可以看到build.gradle文件,这个是项目的构建脚本。Gradle 是以Groovy语言为基础,面向Java应用为主。基于DSL (领域特定语言)语法的自动化构建工具。
Gradle这个工具集成了构建、测试、发布及常用的其他功能,如软件打包、生成注释文档等。与以往Maven等构架工具不同,配置文件不需要繁琐的XML,而是简洁的Groovy语言脚本。
对于本项目的build.gradle文件中配置的含义,下面已经添加了详细注释。// buildscript 代码块中脚本优先执行buildscript// ext用于定义动态属性ext {springBootVersion = '2.0.0.M4'//使用了Maven的中央仓库及Spring自己的仓库(也可以指定其他仓库)repositories {mavenCentral ()maven { url "https:/ / repo. spring. io/ snapshot" }maven { url "https://repo. spring. io/milestone" }//依赖关系dependencies {// classpath声明 了在执行其余的脚本时,ClassLoader可以使用这些依赖项classpath ("org . spr ingframework . boot: spring-boot-gradle-plugin:${ springBootVersion}")}//使用插件apply plugin: 'java'apply plugin: 'eclipse 'apply plugin: 'org. springframework.boot'apply plugin: ' io. spr ing . dependency-management '//指定了生成的编译文件的版本,默认为jar包group = ' com. waylau. spring. cloud'version = '0.0. 1- SNAPSHOT'//指定编译. java文件的JDK版本sourceCompatibility = 1.8//使用了Maven的中央仓库及Spring自己的仓库(也可以指定其他仓库)repositories {mavenCentral ()maven { url "https:// repo. spring. io/ snapshot" }maven { url "https:/ /repo. spring. io/milestone" }//依赖关系dependencies {//该依赖用于编译阶段compile (' org. spr ingframework . boot: spring-boot-starter-web')//该依赖用于测试阶段testCompile('org. springframework. boot:spring-boot-starter-test')
2. gradlew和gradlew.bat文件
gradlew和gradlew.bat这两个文件是Gradle Wrapper用于构建项目的脚本。使用Gradle Wrapper
的好处在于,可以使项目组成员不必预先在本地安装好Gradle工具。在用Gradle Wrapper构建项目时,Gradle Wrapper首先会去检查本地是否存在Gradle,如果没有,会根据配置上的Gradle的版本和安装包的位置来自动获取安装包并构建项目。使用Gradle Wrapper的另一个好处在于,所有的项目组成员能够统一项目所使用的Giradle版本,从而规避了由于环境不一-致 导致的编译失败的问题。
对于Gradle Wrapper的使用,在类似UNIX的平台上(如Linux和Mac OS),直接运行gradlew脚本,就会自动完成Gradle环境的搭建。而在Windows环境下,则执行gradlew.bat文件。
3. build和.gradle目录
build和.gradle目录都是在Gradle对项目进行构建后生成的目录和文件。
4. Gradle Wrapper
Gradle Wrapper免去了用户在使用Gradle进行项目构建时需要安装Gradle的繁琐步骤。每个
Gradle Wrapper都绑定到-一个特定版本的Gradle,所以当第一次在给定Gradle 版本下运行上面的命令之一时,它将下载相应的Gradle发布包,并使用它来执行构建。默认情况下,Gradle Wrapper的发布包指向的是官网的Web服务地址,相关配置记录在gradle-wrapper.properties文件中。我们查看一下Spring Boot提供的这个Gradle Wrapper 的配置,参数“distributionUrl” 就是用于指定发布包的位置。
#Fri Jul 28 13:37:07 BST 2017distributionBase=GRADLE USER HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE USER_ HOMEzipStorePath=wrapper/distsdistributionUrl=https:/ /services .gradle. org/distributions/gradle-4.0.2-bin.zip
从上述配置可以看出,当前Spring Boot采用的是Gradle 4.0.2版本。我们也可以自行来修改版本和发布包存放的位置。例如,下面这个例子 ,我们指定了发布包的位置在本地的文件系统中。
distributionUrl=file:/D:/software/webdev/java/gradle-4.0-all.zip
5. src目录
如果用过Maven,那么肯定对src目录不陌生。Gradle 约定了该目录下的main目录下是程序的源码,test 下是测试用的代码。
如何提升Gradle的构建速度
由于Gradle工具是舶来品,所以对于国人来说,很多时候会觉得编译速度非常慢。这里面很
大一部分原因是由于网络的限制,毕竟Gradle及Maven的中央仓库都架设在国外,国内要访问,
速度上肯定会有一些限制。下面介绍几个配置技巧来提升Gradle的构建速度。
1. Gradle Wrapper指定本地
正如之前我们提到的,GradleWrapper是为了便于统一版本。如果项目组成员都明确了GradleWrapper,尽可能事先将Gradle放置到本地,而后修改Gradle Wrapper配置,将参数“distributionUr"指向本地文件。例如,将Gradle放置到D盘的某个目录:
#distributionUrl=https://services . gradle . org/distributions/gradle-4.0.2-bin.zipdistributionUrl=file:/D:/software/webdev/java/gradle-4.0-all.zip
2.使用国内Maven镜像仓库
Gradle可以使用Maven镜像仓库。使用国内的Maven镜像仓库可以极大地提升依赖包的下载速度。下面演示了使用自定义镜像的方法。
repositories {/ /mavenCentral ()maven { url "https:/ / repo. spring. io/ snapshot" }maven { url "https:/ /repo. spring. io/milestone" }maven { url "http:/ /maven. aliyun. com/ nexus/ content/groups/public/"}
这里注释掉了下载缓慢的中央仓库,改用自定义的镜像仓库...