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所示。
图1-1 下载Maven安装文件
在下载完成后,直接解压缩即可。为了便于使用mvn命令,可以在PATH环境变量中添加Maven主目录(笔者机器上Maven的目录为D:\OpenSource\apache-maven-3.8.5)下的bin子目录,如图1-2所示。
图1-2 将Maven安装目录下的bin子目录添加到PATH环境变量中
打开命令提示符窗口,执行mvn-v,如果出现版本信息,则说明已经安装成功,如图1-3所示。
图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所示。
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的默认配置。
例如,在例1-1的pom.xml文件所在目录下执行上述命令,Maven将会开始处理并显示effective-pom,如图1-4所示。
图1-4 查看Super POM默认配置
提示:在第一次执行的时候会下载一些JAR包,请耐心等待。
在控制台窗口中会输出一个XML文档,该文档就是在应用继承、插值和配置文件后生成的Effective POM,代码如下所示:
2.依赖的配置
在项目中会用到各种库,因而经常需要配置依赖,依赖是通过<dependencies>和它的子元素<dependency>来进行配置的,配置的依赖会自动从项目定义的仓库中下载。代码如下所示:
<dependencies>元素可以有一个或多个<dependency>子元素,以声明一个或多个项目依赖。每个项目依赖可以包含的子元素如下。
● <groupId>、<artifactId>、<version>:依赖的基本坐标,对于任何一个依赖来说,基本坐标都是最重要的,Maven根据坐标才能找到需要的依赖。
● <type>:依赖的类型,类型通常和使用的打包方式对应,默认值为jar,通常表示依赖的文件的扩展名,如jar、war等。在大部分情况下,该元素不必声明。
● <scope>:依赖的范围。该元素用于计算编译、测试等的各种类路径,还帮助确定在一个项目的发行版中包含哪些构件。<scope>元素的值如表1-1所示。
● <optional>:标记依赖是不是可选的。
● <exclusions>:用于排除传递性依赖。
表1-1 <scope>元素的值
1.2.3 配置Maven
Maven会自动根据<dependencies>元素中配置的依赖项,从Maven仓库中下载依赖到本地的.m2目录下,默认的路径为:C:\Users\[用户名]\.m2\repository(用户名为当前登录Windows系统的用户名)。
如果要修改默认的路径,则可以在Maven主目录下的conf子目录下找到settings.xml文件,打开该文件,找到下面的代码:
使用<localRepository>元素指定本地仓库的位置,如下所示:
由于Maven的中心仓库位于国外的服务器上,所以在国内用户访问Maven仓库时会比较慢,为此,我们可以修改Maven的配置文件,使用<mirror>元素来设置一个阿里云仓库的镜像。继续编辑settings.xml文件,添加下面的代码:
粗体显示的代码是新增的。
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
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
@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所示的启动信息。
图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所示。
图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所示。
图1-7 以JAR包的方式运行Spring Boot应用的结果
打开浏览器,访问http://localhost:8080/,查看服务器发回的响应信息。
要退出应用,按下键盘上的组合键“Ctrl+C”即可。