构建一个简单的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 ...
随机推荐
- 65.Longest Increasing Subsequence(最长增长子序列)
Level: Medium 题目描述: Given an unsorted array of integers, find the length of longest increasing sub ...
- vue-froala-wysiwyg 富文本编辑器
近期需要在vue3项目上做一个富文本编辑器,找了很多插件组件,最终决定用 froala.虽然不是免费的,但是功能实在是太强大了. froala 文档:https://www.froala.com/wy ...
- Gradle中的GroupID和ArtifactID指的是什么?
GroupId和ArtifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. GroupId一般分为多个段 ...
- JavaScript给动态插入的元素添加事件绑定
由于实际的需要,有时需要往网页中动态的插入HTML内容,并在插入的节点中绑定事件处理函数.我们知道,用Javascript向HTML文档中 插入内容,有两种方法, 一种是在写HTML代码写入JS,然后 ...
- 四、附加到进程调试(.NET Core)
1.安装.net core windows server托管工具包: 1.下载https://dotnet.microsoft.com/download/thank-you/dotnet-runtim ...
- python常用魔法函数
1.__init__(): 所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对 ...
- [BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组
题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(i ...
- python3访问MySQL数据库
import pymysql db = pymysql.connect( host='XXXXXXXX.com', #数据库服务器地址 user='XXX', #用户名 passwd='XXX', d ...
- TCC、XA 、DTP区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11623047.html TCC的优缺点 优点 解决了跨服务的业务操作原子性问题,例如组合支付.下订单减 ...
- https 配置
参考:https://www.cnblogs.com/tanghuachun/p/9951849.html 1.将pfx文件拷贝到application.properties同级目录下 2.添加配置文 ...