![详解Spring Boot:从入门到企业级开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/831/47379831/b_47379831.jpg)
1.2 快速掌握Maven
在安装Maven前需要先安装好Java 8或以上版本的JDK,JDK的安装和配置这里我们就不介绍了,如果读者对Java语言还不熟悉,则可以参看笔者的另一本著作《Java无难事》。不过要提醒读者的是,在Windows平台下安装JDK之后,需要配置JAVA_HOME环境变量,其值为JDK安装后的主目录全路径名,或者在PATH环境变量中添加JDK安装主目录下的bin子目录,当然也是全路径名。
1.2.1 下载并安装Maven
Maven是一款跨平台的项目管理工具,也是Apache软件基金会一个成功的开源项目。Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息构建。Spring Boot 2.6.x与Apache Maven 3.5或更高版本兼容。
读者可自行进入Maven官网下载页面,选择“apache-maven-3.8.5-bin.zip”进行下载,如图1-1所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_19_1.jpg?sign=1738927913-ekBBal5R0wFJAjMAAlf97XJ04VZmZ5qW-0-b5a3eaa49d137e7f4e4e31e798f37c70)
图1-1 下载Maven安装文件
在下载完成后,直接解压缩即可。为了便于使用mvn命令,可以在PATH环境变量中添加Maven主目录(笔者机器上Maven的目录为D:\OpenSource\apache-maven-3.8.5)下的bin子目录,如图1-2所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_19_2.jpg?sign=1738927913-XuKRlieOBNdYD40sLZJT2aDGE2f4f2Kj-0-650fee74cc910ba580ac10cff9472678)
图1-2 将Maven安装目录下的bin子目录添加到PATH环境变量中
打开命令提示符窗口,执行mvn-v,如果出现版本信息,则说明已经安装成功,如图1-3所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_19_3.jpg?sign=1738927913-jtcT5McJstmYtOVY2naCbAWTd9k3vPyq-0-d5ebf35c4d49e62b60327791f7c00ebc)
图1-3 执行mvn-v
1.2.2 认识pom.xml文件
POM(Project Object Model,项目对象模型)是Maven项目的基本工作单元,也是Maven项目的核心,它是一个XML文件(即pom.xml),包含项目的基本信息,用于描述项目如何构建、声明项目依赖等。
在执行任务或目标时,Maven会在当前目录中查找pom.xml,读取所需的配置信息,然后执行目标。
在POM中可以指定以下配置:
● 项目依赖
● 插件
● 执行目标
● 项目构建profile
● 项目版本
● 项目开发者列表
● 相关邮件列表信息
pom.xml的文档结构是通过XML Schema来定义的,对于熟悉XML Schema的读者来说,可以直接通过模式文档来了解POM的结构。我们看一个简单的pom.xml文件,如例1-1所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_20_1.jpg?sign=1738927913-ViKDKUS3pU9mFNkzwbgBPuKIIIpHNnce-0-8afda979db8d689723876e35eb7e0e30)
pom.xml文件以<project>元素作为根元素,在该元素上声明了默认的名称空间和XML Schema实例名称空间,并将xsi前缀与XML Schema实例名称空间绑定。使用xsi:schemaLocation属性指定名称空间和模式位置相关。
<project>根元素下的第一个子元素<modelVersion>用于指定当前POM模型的版本,对于Maven 2和Maven 3来说,它只能是4.0.0。
pom.xml文件中最重要的是<groupId>、<artifactId>和<version>这三个元素,这三个元素定义了一个项目基本的坐标。在Maven世界中,任何的jar、pom或者war都是基于这些基本的坐标进行区分的。
<groupId>元素定义了项目属于哪个组,这个组通常和项目所在的公司或者组织存在关联。groupId一般分为多个段,第一段为域,第二段为公司名称,这两段可以使用公司或组织的域名,只是顶级域名在前面。如果有项目组,那么第三段可以是项目组标识。例如,一个公司的域名为mycom.com,有一个项目组为myapp,那么groupId就应该是com.mycom.myapp。
<artifactId>元素定义了当前Maven项目在组中唯一的ID,它通常是项目的名称。一个groupId下的多个项目就是通过artifactId进行区分的。例如,一个OA项目,可以直接指定artifactId为oa。
<version>元素定义了项目的版本号。在artifact的仓库中,该元素用来区分不同的版本。例如,1.0-SNAPSHOT版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version被不断更新,如升级为1.0、1.1-SNAPSHOT、1.1、2.0版本等。
1.超级(Super)POM
超级POM是Maven默认的POM,任何一个Maven项目都隐式地继承自该POM,类似于Java中任何一个类都隐式地从java.lang.Object类继承。超级POM包含了一些可以被继承的默认设置,当Maven发现需要下载POM中的依赖时,它会到Super POM配置的默认仓库中去下载。
对于Maven 3,Super POM位于Maven安装主目录下的lib\maven-model-builder-3.x.x.jar文件中,在该JAR包中的位置是:org\apache\maven\model\pom-4.0.0.xml。
Maven使用Effective POM(Super POM加上项目自己的配置)来执行相关的目标,帮助开发者在pom.xml中做尽可能少的配置,当然这些配置也可以被重写。
在pom.xml文件所在的目录下,可以使用以下命令来查看Super POM的默认配置。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_21_1.jpg?sign=1738927913-KSdKwFv7yuWT8HRUvajpVSyh9DaVI4rW-0-0985d24af02bf2294349043c668fb032)
例如,在例1-1的pom.xml文件所在目录下执行上述命令,Maven将会开始处理并显示effective-pom,如图1-4所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_21_2.jpg?sign=1738927913-Ill9RsMHibcZyUv5ouTwB417nNAd7e9F-0-351c8c639f14b0a6a08fc08914a6d269)
图1-4 查看Super POM默认配置
提示:在第一次执行的时候会下载一些JAR包,请耐心等待。
在控制台窗口中会输出一个XML文档,该文档就是在应用继承、插值和配置文件后生成的Effective POM,代码如下所示:
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_21_4.jpg?sign=1738927913-yVdKwpezOPqupS7rSN8UhTGY9hEvxegw-0-0377d74504981ecdacca3561201eb988)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_22_1.jpg?sign=1738927913-Ppbq8SMiePGUhZmBvStWPCck92XCFTxt-0-643530a078832bf4ecc446f0ea6c8a72)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_23_1.jpg?sign=1738927913-kNcwnJfEcbmkySQJbdaxvg2AHhgea3vD-0-e9646e02006578936522166cdcdfca74)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_24_1.jpg?sign=1738927913-IwHdsXxKiE8ycIi9ti4QvjI56Bi4jtNS-0-77b81632f72df9a86d31e49f5e3f9622)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_25_1.jpg?sign=1738927913-6k7sCUrxfqk3PLc2BV8UyDuAcfc0h31C-0-41ae24cbcb78efe97d1db423d5437e25)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_26_1.jpg?sign=1738927913-Qizgy61vZFBiXOu48xfkg73Q8xoB70xz-0-3b2147f03267013b482ba40f9029c934)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_27_1.jpg?sign=1738927913-XzwnmuC2aKAG2V0T9HBOZrFKzZuhsckF-0-92d415e634ba0309c7358316621f198a)
2.依赖的配置
在项目中会用到各种库,因而经常需要配置依赖,依赖是通过<dependencies>和它的子元素<dependency>来进行配置的,配置的依赖会自动从项目定义的仓库中下载。代码如下所示:
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_27_2.jpg?sign=1738927913-u9MdsmdVqKTZmreHONI4Nx5yCBnERlpI-0-4113a3b7b66e4331efc7da38e76c9a8a)
<dependencies>元素可以有一个或多个<dependency>子元素,以声明一个或多个项目依赖。每个项目依赖可以包含的子元素如下。
● <groupId>、<artifactId>、<version>:依赖的基本坐标,对于任何一个依赖来说,基本坐标都是最重要的,Maven根据坐标才能找到需要的依赖。
● <type>:依赖的类型,类型通常和使用的打包方式对应,默认值为jar,通常表示依赖的文件的扩展名,如jar、war等。在大部分情况下,该元素不必声明。
● <scope>:依赖的范围。该元素用于计算编译、测试等的各种类路径,还帮助确定在一个项目的发行版中包含哪些构件。<scope>元素的值如表1-1所示。
● <optional>:标记依赖是不是可选的。
● <exclusions>:用于排除传递性依赖。
表1-1 <scope>元素的值
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_28_1.jpg?sign=1738927913-GfwNLVcd9TNN3N8cFGH19xEA0lkC5FDf-0-ad1ae81c13eeffca6dab2fc09dfe39b6)
1.2.3 配置Maven
Maven会自动根据<dependencies>元素中配置的依赖项,从Maven仓库中下载依赖到本地的.m2目录下,默认的路径为:C:\Users\[用户名]\.m2\repository(用户名为当前登录Windows系统的用户名)。
如果要修改默认的路径,则可以在Maven主目录下的conf子目录下找到settings.xml文件,打开该文件,找到下面的代码:
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_28_2.jpg?sign=1738927913-hOEB3808yoFm4hHTSkeVQinCmy0KDJAv-0-9b3bbca3e1f09ea987274ace376e6449)
使用<localRepository>元素指定本地仓库的位置,如下所示:
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_28_3.jpg?sign=1738927913-7pZauzt9PwVr9KD7Yaoac8A4ylrX5AJX-0-65deec691afd7f29bd772c56201fe4ac)
由于Maven的中心仓库位于国外的服务器上,所以在国内用户访问Maven仓库时会比较慢,为此,我们可以修改Maven的配置文件,使用<mirror>元素来设置一个阿里云仓库的镜像。继续编辑settings.xml文件,添加下面的代码:
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_28_4.jpg?sign=1738927913-tZSvEcKHZiVhk6vZIuaJTl1Atsi0V8XD-0-917cdc5f36d67166d3dd701fa1acd658)
粗体显示的代码是新增的。
1.2.4 使用Maven和JDK开发Spring Boot应用
这一节我们采用比较原始的方式来开发一个Spring Boot应用,即使用Maven和JDK来开发一个hello应用。
1.编写pom.xml文件
首先建立项目目录hello,在该目录下新建一个pom.xml文件,文件内容如例1-2所示。
例1-2 hello\pom.xml
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_29_1.jpg?sign=1738927913-8eWgVWBSh5pRzbXZAdvzKsyLamyaSCGQ-0-ee7a10208d640cfae7f35c0ef84434ce)
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_30_1.jpg?sign=1738927913-DXuEVysNdhfIRJOeZU9xiScBCVLqokE6-0-ba7ec40549904a4f44083c8f95c44205)
Spring Boot依赖项使用的groupId是org.springframework.boot。<parent>元素用于声明父模块,对于Spring Boot项目来说,通常都是让POM文件继承自spring-boot-starter-parent项目。spring-boot-starter-parent是Spring Boot的核心启动器,包含自动配置、日志和YAML等大量默认的配置,从该模块继承,可以获得默认配置,简化了我们的开发工作。子元素<version>指定了使用的Spring Boot版本,之后配置的Spring Boot模块会自动选择最合适的版本进行添加。
在<dependencies>元素中添加了需要使用的starter模块,本例添加了spring-boot-starter-web模块,该模块是开发Web应用时常用的模块,包含Spring Boot预定义的Web开发常用的一些依赖包,如spring-webmvc、spring-web、validation、tomcat等。
Spring Boot项目的打包需要用到spring-boot-maven-plugin插件,如果是在开发阶段运行项目,则不需该插件。
2.编写Java代码
接下来我们可以开始编写Java代码了,由于Maven默认的编译路径为src/main/java下面的源码,所以我们需要按照这个目录结构创建对应的文件夹。之后在src/main/java目录下新建Hello.java文件,文件内容如例1-3所示。
例1-3 Hello.java
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_30_2.jpg?sign=1738927913-oz5NHB54NyelkqaozvdM99Kbdp1QoCCQ-0-9d93350b0f672e8ec753dd77f4705b79)
@RestController注解是一个组合注解,相当于将@Controller和@ResponseBody注解合在一起使用。该注解在类型上使用,表明该类型是一个REST风格的控制器,之后使用的@RequestMapping注解默认采用@ResponseBody语义,即将方法的返回值直接填入HTTP响应体中。
@EnableAutoConfiguration注解用于启用Spring应用程序上下文的自动配置,该注解可以让Spring Boot根据当期项目添加的JAR依赖自动配置我们的Spring应用。例如,如果在classpath下存在HSQLDB,并且没有手动配置任何数据库连接bean,那么将自动配置一个内存型(in-memory)数据库。
@RequestMapping注解用于将Web请求映射到请求处理类中的方法上。该注解可以用在类或方法上,如果用在类上,则表示类中所有响应请求的方法都是以该地址作为父路径的。
SpringApplication类用于从Java的main方法引导和启动Spring应用程序。在大多数情况下,我们只需要在main方法中调用静态的run(Class,String[])方法来引导应用程序即可。
3.运行项目
打开命令提示符窗口,进入项目目录hello,执行命令mvn spring-boot:run来启动项目,spring-boot:run表示运行spring-boot插件的run目标。在命令执行完成后,可以看到如图1-5所示的启动信息。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_31_1.jpg?sign=1738927913-uJlHQSuy5QwpPHhhh1WvVqMytZTc28Dz-0-c271c6891d803a214d27853276a8ad54)
图1-5 执行mvn spring-boot:run启动Spring Boot应用
要确保命令执行过程中没有出现任何错误。
这是一个简单的Web应用,打开浏览器,访问http://localhost:8080/,可以看到服务器返回的“Hello World!”字符串信息。
要退出应用,按下键盘上的组合键“Ctrl+C”即可。
4.打包
可以将Spring Boot应用打包成可执行的JAR文件,其中包含所有编译后生成的.class文件和依赖包,该文件可以直接在生产环境中运行。
Spring Boot的这种打包方式需要用到spring-boot-maven-plugin插件,该插件我们在例1-2中已经配置了。
在项目的hello目录下,执行命令mvn package就可以开始打包了,如图1-6所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_32_1.jpg?sign=1738927913-DCgLl2CDAHJVPhEtWBL0rPL4HSZYriFJ-0-1b3e18e9a5edd4b1f951618d06461325)
图1-6 对Spring Boot应用进行打包
在打包完成后,在项目目录hello下,会看到一个target目录,在target目录下有一个hello-1.0-SNAPSHOT.jar文件,可以通过执行命令jar tvf target/hello-1.0-SNAPSHOT.jar来查看其中的内容。
在项目目录hello下,执行命令java-jar target/hello-1.0-SNAPSHOT.jar,来启动打包后的Spring Boot应用,运行结果如图1-7所示。
![](https://epubservercos.yuewen.com/450A7A/26763867809480806/epubprivate/OEBPS/Images/43984_32_2.jpg?sign=1738927913-7WGUEkfszpSSuZ9rSTCt16e6KiHBJwP4-0-a1ed993216d248fa901941099b5570cc)
图1-7 以JAR包的方式运行Spring Boot应用的结果
打开浏览器,访问http://localhost:8080/,查看服务器发回的响应信息。
要退出应用,按下键盘上的组合键“Ctrl+C”即可。