《Spring Boot官方指南》(二)入门(二)
3.2.5 命令行补全工具
Spring Boot CLI附带了一些脚本,这些脚本为BASH 和zsh提供了命令行补全功能。在任何shell里面都可以source
到这些脚本(也叫spring
),也可以初始化到个人或者系统级别的命令行工具里面。在Debian系统里面,系统级别的脚本在这个路径:/shell-completion/bash
,shell程序启动以后,这里面的所有脚本都可以执行。例如,您已经使用SDKMAN!安装了这些脚本,为了手动执行他们,可以这样操作:
$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring $ spring <HIT TAB HERE> grab help jar run test version
![]() |
Note |
---|---|
如果您使用Homebrew或者MacPorts安装了Spring Boot CLI,这些命令行补全脚本已经自动注入到了您的shell程序里面。 |
这是一个极其简单的Web应用程序,可以用来验证您的安装是否正确。新建一个文件,文件名是app.groovy
:
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { "Hello World!" } }
然后简单运行一下这个命令:
$ spring run app.groovy
![]() |
Note |
---|---|
第一次运行这个应用程序,要下载一些依赖项目,将会耗费一些时间。以后再运行的话就会快很多了。 |
打开您的浏览器访问localhost:8080,应该可以得到下面的内容:
Hello World!
如果想要从旧版本的Spring Boot升级,检查一下存放在这里project wiki 的 “release notes”。您可以找到升级信息与每个版本的“新的和值得关注的”功能列表以及说明。
使用相关的包管理工具升级您已经使用命令行安装过的早期版本(比如,brew upgrade
),另外,如果您是手动安装的CLI,阅读这个标准说明,同时记得更新环境变量PATH
的值,以便移除旧版本的引用。
用Java语言开发一个简单的Web应用程序“Hello World!”,我们将会特别提到一些Spring Boot关键特性。就用Maven来构建这个项目,因为很多IDE都支持Maven。
![]() |
Tip |
---|---|
这个网站spring.io有很多使用了Spring Boot的 “入门”级别教程。如果需要解决个别的问题,可以先去这个网站找找看。可以简化下面的开发步骤。访问网站start.spring.io,在依赖搜索里面选择web 启动。这样就可以自动生成一个新的项目框架,以便您以恰当的方式开始编写您的代码。更多有关的细节,可以查看文档。 |
在我们开始之前,打开终端确认您已经安装了恰当Java和Maven版本。
$ java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
$ mvn -v Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven home: /Users/user/tools/apache-maven-3.1.1 Java version: 1.7.0_51, vendor: Oracle Corporation
![]() |
Note |
---|---|
这个实例创建在自己的目录中。接下来内容假定您已经创建好了恰当的目录,这个目录叫“当前目录”。 |
我们从创建一个Mavenpom.xml
文件开始。pom.xml
是用来构建您的项目的描述性文件。用文本编辑器把下面的内容输入到这个文件。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.BUILD-SNAPSHOT</version> </parent> <!-- Additional lines to be added here... --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
像这样,应该可以进行构建工作了,运行一下命令mvn package
看看输出信息(现在暂时忽略这个警告信息“jar will be empty – no content was marked for inclusion!”)。
![]() |
Note |
---|---|
现在您也可以把这个项目导入进入一个IDE了(大多数的现代JAVA IDE内置了Maven)。为了方便,我们继续使用纯文本编辑器来开发这个例子。 |
Spring Boot提供了一些“Starters”,让您方便把jar文件添加到您的classpath。我们的实例已经在POM文件的parent
部分添加了spring-boot-starter-parent
。spring-boot-starter-parent
是一个添加了一些默认Maven配置的特殊的starter。也添加了dependency-management
部分,这个部分可以让您省掉某些依赖项的version
标签。
其他的 “Starters”添加了在您开发其他特定类型应用程序的时候,您很可能需要添加的一些依赖项。我们目前正在开发Web应用,我们需要添加依赖项spring-boot-starter-web
,不过我们先通过下面的方式看看目前的情况。
$ mvn dependency:tree [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree
命令输出了项目依赖项的树状示意图。您会发现spring-boot-starter-parent
本身并没有引入任何依赖。编辑pom.xml
文件, 把spring-boot-starter-web
依赖添加到parent
部分的下面:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
再次运行一下mvn dependency:tree
,您可以发现现在增加了一些依赖项,包括Tomcat Web服务器和Spring Boot。
需要编写一个简单的Java文件来完成我们的应用程序。Maven默认在src/main/java
这个目录下编译源文件,所以您创建好目录,然后新建一个源文件src/main/java/Example.java
:
import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
虽然代码量不多,不多其实内容很丰富。我们逐步理解一下关键步骤。
Example
类的第一个注解是@RestController
。这叫做构造型注解。它提示我们,对Spring来说,这个类扮演了特殊的角色,现在,这个类是一个Web控制器
,Spring将会使用它来处理Web请求。
@RequestMapping
注解展示了 “routing”信息。它告知Spring路径为“/”的HTTP请求都会映射到home
方法。@RestController
告知Spring直接将结果字符串返回给请求方。
![]() |
Tip |
---|---|
@RestController 与@RequestMapping 注解属于 Spring MVC(它们不属于Spring Boot).更多资料,可以查看Spring参考文档的MVC 部分。 |
第二个类级别的注解是@EnableAutoConfiguration
。 这个注解告知Spring Boot自己 “判断”您是如何配置Spring的,这基于您添加的依赖项。因为依赖项spring-boot-starter-web
添加了Tomcat和Spring MVC,所以@EnableAutoConfiguration
注解会判断您是在开发Web应用程序并且引入了Spring。
Starters and Auto-Configuration
Auto-configuration是为了和“Starters”一起良好工作而设计的,但是这两个部分并没有耦合在一起。您在starters的约束之外自由挑选jar依赖,而Spring Boot将会尽可能的自配置以适应您的应用程序。
现在我们的程序应该可以工作了。因为我们在POM文件里面使用了spring-boot-starter-parent
,所以我们可以使用run
指令来启动应用程序了。在项目根目录输入mvn spring-boot:run
启动应用程序:
$ mvn spring-boot:run . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.1.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.222 seconds (JVM running for 6.514)
打开浏览器访问localhost:8080,您应该可以看到输出了下面的内容:
Hello World!
敲击ctrl-c
就能退出程序了。
就像生产一个真正的软件产品,我们创建一个完整自足的可执行jar文件,把我们的第一个实例完成。可执行的jar文件(有时候我们也叫“富jar文件”)是一个归档文件,包含了编译好的类文件与我们运行程序所需要的所有jar依赖项。
可执行jar文件与Java
Java并没有提供任何加载内嵌jar文件的标准方法(也就是jar文件还包含jar文件)。所以,如果您想发布一个完整的应用程序,将会很困难。
为了解决这个问题,许多开发者使用“uber” jars。 一个uber jar文件把所有的类,包括第三方jar包的类,都归档到一个文件。这也带来了问题,这将难以辨认哪些库是您的应用程序真正采用的。还有,如果多个jar文件里面采用了相同的文件名(但是内容不同),也会引起问题。
Spring Boot采用了一种不同的方式来让您直接加载内嵌的jar包。
为了创建可执行jar文件,我们把spring-boot-maven-plugin
添加到pom.xml
。把下面的代码添加到dependencies
部分下面:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
![]() |
Note |
---|---|
spring-boot-starter-parent POM包含绑定到repackage 目标的<executions> 配置。如果不使用parentPOM,你需要自己声明该配置,具体参考插件文档。 |
保存pom.xml
,并从命令行运行mvn package
:
$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] .... .. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject --- [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:1.4.1.BUILD-SNAPSHOT:repackage (default) @ myproject --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
如果查看target
目录,你应该可以看到myproject-0.0.1-SNAPSHOT.jar
,该文件大概有10Mb。想查看内部结构,可以运行jar tvf
:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
在该目录下,你应该还能看到一个很小的名为myproject-0.0.1-SNAPSHOT.jar.original
的文件, 这是在Spring Boot重新打包前,Maven创建的原始jar文件。
使用java -jar
命令运行该程序:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.1.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.536 seconds (JVM running for 2.864)
正如刚才一样,敲击ctrl-c退出应用。
希望本章的内容已经让您理解了部分Spring Boot的基础知识,并且掌握了以您的方式开发应用程序的方法。如果您面向任务的类型的开发人员,您可能想要直接跳到spring.io,查阅一些解决“怎样和Spring一起工作”这个问题的入门教程。我们也有一些Spring Boot定制的怎么做的参看文档。
Spring Boot仓库也可以运行的一些例子。这些例子和其他代码无关的(也就是说您不需要构建其他的代码就能运行或者使用这些例子)。
另外,按照顺序,接下来的内容是Part III, “Using Spring Boot”.。如果您真的缺乏耐心,可以继续往前,阅读Spring Boot特性。
最后更新:2017-05-19 14:06:27