构建一个简单的Spring Boot项目
11 构建一个简单的Spring Boot项目
这个章节描述如何通过Spring Boot构建一个“Hello Word”web应用,侧重介绍Spring Boot的一些重要功能。因为大多数的开发工具都支持Maven,所以我们使用它来构建这个应用。
网站 spring.io 包含了许多如何开始使用Spring Boot的指南。如果您需要解决具体的问题,可以先去这里看看。你可以跳过以下的步骤,通过 start.spring.io 网站来构建项目。这样做的话,你就可以直接编写代码啦。如果需要了解更多详情,点击 Spring Initializr documentation
在我们开始之前,先打开命令终端,运行以下命令,确认Java的版本和Maven的安装。
个人备注:Spring Boot在2.0以下,1.21以上包含1.21版本,jdk版本要求1.7;
2.0以上包含2.0 jdk版本要求1.8+
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
$ mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_102, vendor: Oracle Corporation
11.1 创建POM文件
我们需要从创建Maven的pom.xml文件开始,可以这么理解,pom.xml是构建项目的结构。打开你喜欢的编辑器添加如下部分代码。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://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>2.1.8.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
<!-- 在此处添加其他行... -->
</project>
通过以上的操作,应该可以正常将项目构建好,然后你可以通过运行mvn package命令来打包项目,这时候你可以忽略“jar will be empty - no content was marked for inclusion!”警告。
做完以上的步骤,你就可以将项目导入到类似IDEA的开发工具中。因为这个项目比较简单,我们继续用简单的text编辑器来构建项目,这样来的更为方便。
11.2 添加项目依赖
Spring Boot提交了许多“启动器”让你选择添加到项目依赖中。我们的示例已经在POM的部分章节中使用了spring-boot-starter-parent。它是一种特殊的启动器,提供了默认的Maven配置。它还提供了dependency-management部分,让你可以不用指定依赖包版本引用依赖的jar包。
其他的“启动器”提供了一些特殊开发需要的依赖。比如当我们开发web应用的时候,我们添加spring-boot-starter-web依赖。在此之前,我们先看看我们现在有哪些依赖,运行一下命令。
$ mvn dependency:tree
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree这个命令会以树形结构展示你项目的依赖。你可以看到spring-boot-starter-parent没有为自己提供任何依赖。为了让web应用可以正常运行,现在在你的pom.xml文件中添加“spring-boot-starter-web”依赖,具体如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果现在你再运行一次mvn dependency:tree命令,你会看到多出很多其他的依赖包,比如Tomcat web Server和Spring Boot。
11.3 编写代码
为了让完成我们的web应用,我们编写一个简单的Java类。Maven默认编译src/main/java下的代码,所以你需要在这个路径下新建Example.java类,然后添加如下代码:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}
}
尽管这里的代码量没有很多,但是做了的事情却不少,下面来具体介绍下这里面的重要部分。
11.3.1 注解 @RestController 和注解 @RequestMapping
在上面示例代码Example.java类中,@RestController是我们使用的第一个注解。这个注解被称之为构造型注解。对于我们来说,它暗示着这个类在Spring Boot中具有特殊的意义,即,这个类是web控制器,用来捕捉进来的请求。
@RequestMapping注解提供了路由信息,它告诉Spring任何HTTP以“/”路径的请求都将被映射到home方法中。@RestController还告诉了Spring将结果直接以字符串的方式返回到请求方。
@RequestMapping 和 @RestController注解是Spring MVC的注解,跟Spring Boot没有具体的关系,如果想要了解更多,可以看MVC章节的相关文档
11.3.2 @EnableAutoConfiguration注解
第二个使用在类上面的注释是 @EnableAutoConfiguration,这个注解告诉Spring通过你在应用添加的依赖包来猜测你对Spring的配置(其实用猜测不是特别的准确,就是通过已经有的jar包,提供默认的配置)。因为spring-boot-starter-web已经添加了Tomcat和Spring MVC,自动化配置就会假设你在开发Spring Web项目,从而会依照Web开发为你做相应的配置。
启动器和自动化配置
自动化配置设计的宗旨是同启动器协同工作,但是它们之间没有直接的联系。也就说,你可以自由的选择启动器以外的jar包,Spring Boot依然会尽可能为你的应用做自动化配置。
11.3.3 main方法
应用最后的部分就是这个“main”方法,这只是一个遵循了Java标准的程序入口方法。通过调用run方法,我们的“main”方法委托给了Spring Boot的SpringApplication类,SpringApplication再引导我们的应用,启动Spring,启动自动配置的Tomcat。我们需要将Example.class作为参数传递给SpringApplication,以便它知道哪部分才是Spring的重要组件。args数组也可以通过命令行参数传递。
11.4 启动Example项目
到了这里,你的应用应该可以正常启动运行了。因为你已经添加了在POM里引用了spring-boot-starter-parent,你还有一个有效的程序运行入口。在文件的根目录运行终端,输入mvn spring-boot:run启动你的项目,你应该会看到类似于下面的输出:
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)
如果你打开了一个浏览器,输入地址: localhost:8080,你将会看到如下的输出:
Hello World!
想要关闭应用,只需要输入ctrl + C即可。
11.5创建一个可执行的Jar包
最后,我们通过创一个完全包含所需要的jar的应用来结束示例。可执行的jar(有时候被称之为“fat jars”,实在不知道怎么翻译这个词,胖夹?汗)将会包含已编译的class文件和运行时所需要的所有依赖jar。
Executable jars and Java
Java没有提供嵌套jar的标准方法,这可能会导致你在分发应用的时候出现问题。
为了解决这个问题,许多开发人员使用“uber”jars,一个uber jar可以将class和应用所有的依赖打包成单个完成物,一般就是一个jar。这种方式的问题在于,打包完成后,你就很难看到其中包含了哪些依赖包了。还有种情况就是如果两个包名是一样的,但内容却不一样,这也可能引发问题。
Spring Boot提供了另一种方式解决这个问题,具体查看different approach
为了完成一个完整的jar包,我们需要在应用pom文件中添加如下的代码:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring-boot-starter-parent已经在POM中绑定了打包目标,如果你没有使用这个,你需要自己申明使用。
保存你的pom.xml文件,运行一下命令:
$ 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:2.1.8.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果你打开target目录你将会看到myproject-0.0.1-SNAPSHOT.jar,这个jar包大概在10M左右的样子。如果你想看到里面的内容,可以运行jar tvf命令,具体如下:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
运行完后,你将会在target目录中看到一个名为myproject-0.0.1-SNAPSHOT.jar.original的文件,这是Maven在打包Spring Boot项目原始的文件。
运行项目,使用java -jar命令,具体如下:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.8.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
跟上面一样,关闭应用使用Ctrl + C命令
构建一个简单的Spring Boot项目的更多相关文章
- 一个简单的spring boot程序
搭建一个spring boot项目十分的方便,网上也有许多,可以参考 https://www.cnblogs.com/ityouknow/p/5662753.html 进行项目的搭建.在此我就不详细介 ...
- 新建一个新的spring boot项目
简单几步,在Eclipse中创建一个新的spring Boot项目: 1.Eclipse中安装STS插件: Help -> Eclipse Marketplace... Search或选择&qu ...
- 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标
如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...
- 简单的Spring Boot项目——实现连接Mysql数据库
一.创建Spring Boot项目 参考:使用IntelliJ IDEA创建简单的Spring Boot项目 二.数据库.表的创建 三.项目开发 3.1 pom.xml文件配置 <?xml ve ...
- 【Spring Boot】创建一个简单的Spring Boot的 Demo
走进Spring Boot 文章目录 走进Spring Boot 环境搭建 新建Spring Boot项目 开始创建项目 配置JDK版本 和 Initializr Service URL 配置Proj ...
- 在eclipse中配置一个简单的spring入门项目
spring是一个很优秀的基于Java的轻量级开源框架,为了解决企业级应用的复杂性而创建的,spring不仅可用于服务器端开发,从简单性.可测试性和松耦合性的角度,任何java应用程序都可以利用这个思 ...
- 用Java构建一个简单的WebSocket聊天项目之新增HTTP接口调度
采用框架 我们整个Demo基本不需要大家花费太多时间,就可以实现以下的功能. 用户token登录校验 自我聊天 点对点聊天 群聊 获取在线用户数与用户标签列表 发送系统通知 首先,我们需要介绍一下我们 ...
- Spring学习(二)——使用Gradle构建一个简单的Spring MVC Web应用程序
1.新建一个Gradle工程(Project) 在新建工程窗口的左侧中选择 [Gradle],右侧保持默认选择,点击next,模块命名为VelocityDemo. 2.在该工程下新建一个 module ...
- 使用IntelliJ IDEA创建简单的Spring Boot项目
方法一: File - New -Project 创建结束后进行测试运行,修改代码如下: package com.springboot.testone; import org.springframew ...
随机推荐
- 表单验证之在a标签跳转之前执行其他操作(DOM与$两种实现方式)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- BUUCTF--reverse2
测试文件:https://buuoj.cn/files/ef0881fc76e5bcd756b554874ef99bec/e8722e94-93d7-45d5-aa06-a7aa26ce01a1.ra ...
- shell脚本从入门到精通(中级)之提高篇
shell 脚本入门到精通(中级) 一.shell 脚本的执行 二.输出格式化 三.数据类型 四.重定向 五.变量 一.shell 脚本的执行 1. 脚本执行的4种方法 $ ls /tmp/test. ...
- python 面向对象(类)--学习笔记
面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...
- 2018-8-10-如何使用-Q#
title author date CreateTime categories 如何使用 Q# lindexi 2018-08-10 19:16:51 +0800 2018-2-13 17:23:3 ...
- 390-基于Zynq UltraScale+ MPSoC的单板嵌入式计算机
基于Zynq UltraScale+ MPSoC的单板嵌入式计算机 概述:Aldec TySOM-3-ZU7EV,将Xilinx Zynq UltraScale+ ZU7EV MPSoC以及DDR4 ...
- (解决某些疑难杂症)Ubuntu16.04 + NVIDIA显卡驱动 + cuda10 + cudnn 安装教程
一.NVIDIA显卡驱动 打开终端,输入: sudo nautilus 在新打开的文件夹中,进入以下路径(不要用命令行): 左下角点计算机,lib,modules 这时会有几个文件夹,对每个文件夹都进 ...
- 【学术篇】bzoj2440 [中山市选2011]完全平方数
-题目の传送门- 题目大意: 找到第k个无平方因子数. 看到数据范围很大, 我们要采用比\(O(n)\)还要小的做法. 考虑如果前\(x\)个数中有\(k-1\)个无平方因子数, 而前\(x+1\)个 ...
- [ES6]react中使用es6语法
前言 不论是React还是React-native,facebook官方都推荐使用ES6的语法,没在项目中使用过的话,突然转换过来会遇到一些问题,如果还没有时间系统的学习下ES6那么注意一些常见的写法 ...
- Nginx的简单使用
一.Nginx概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.它的特点是支持高并发:资源消耗少:可以做HTTP反向代 ...