
Java开发Spring项目最常用的开发工具就是 IntelliJ IDEA 和 STS(Spring Tools Suite) 。本文介绍下如何利用IDEA创建一个SpringBoot的Maven项目,并详细介绍下Maven项目中不可缺少的Pom文件。
开始创建项目
IDEA中通常利用Spring Initializr 新建 项目(project) 或 模块(module) 来开发SpringBoot项目。首先要选择starter service地址,官方地址是 start.spring.io ,但有时连接这个网址会连不上,推荐选择国内的阿里云。

Spring Initializr创建SpringBoot项目
接下来是配置项目参数。主要是项目名称、Java版本、项目版本这些参数。项目类型选择 Maven ,最后会生成一个Maven工程。Maven是Java开发最常用的项目管理工具,可以实现对项目的依赖管理和项目构建。Maven根据group、artifact、version这三个字段组合在一起的唯一坐标,在Maven仓库中定位到需要的jar包。

Spring初始化项目参数
接下来是选择 项目依赖(Dependencies) 。

最后设置 project name 或 module name 。注意这个 name 不是 artifactId ,也不是 groupId 。 在构建项目时, <modules> 的 <module> 所使用的是子项目名称就是这个 <name> 字段名。
Pom文件详解
基于Maven的项目构建完成以后,会发现生成了一系列文件,其中最重要的文件就是 pom.xml 文件,P OM文件主要描述了项目的描述,以及依赖关系。
<?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.weishuo</groupId>
<artifactId>demo01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo01</name>
<description>Demo project for Spring Boot</description>
POM是项目对象模型(Project Object Model)的简称, 在Maven世界中,一个项目可以什么都没有,甚至可以没有代码,但是不能没有pom.xml文件。

Maven的核心概念:项目对象模型和依赖管理模型
接下来我们就来分段介绍Pom文件的组成。
根元素
对于一个pom.xml来说有几个元素是必须定义的,首先是 <project> 根元素,然后就是它里面的modelVersion、groupId、artifactId和version。
在上面的Pom文件的例子中:
- 根节点就是 <project> 。
- <modelVersion> 是4.0.0,这是当前仅有的可以被Maven2&3同时支持的POM版本.
- 在Maven中,使用groupId、artifactId和version组成 groupdId:artifactId:version 的形式来唯一确定一个项目.
另外还有一些字段没有出现,比如 <type> 对应于依赖项目的packaging类型,默认是jar。
属性定义
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<properties> 用于定义全局变量,在POM中通过 ${property_name} 的形式引用变量的值。
项目依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
以上是项目依赖的其他项目,Maven可以根据pom文件中的依赖关系,从本地或远程的Maven仓库中自动*载下**项目锁依赖的Jar包。在B项目中引入A项目依赖,通过依赖传递,会将A中的jar包传递进来。如果B中不需要A中的某个jar包就可以使用以下标签:<exclusions> 。
junit-vintage 是 Junit 4 中使用的引擎,如果项目使用了 Junit 5 的话,需要在 spring-boot-starter-test 中将 JUnit 4 的引擎从测试中删除。junit-jupiter-engine 是 JUnit 5 中使用的测试引擎。
版本管理
Maven中的 dependencyManagement 的作用在于对所依赖的jar包的版本进行管理,与 <dependency>的区别在于,<dependency> 会直接*载下**jar包, <dependencyManagement> 不会*载下**jar包,而只是进行版本管理,比如:
- 如果 <dependencies> 里面的 <dependency> 没有声明 <version> 元素,那么maven就会到 <dependencyManagement> 里面去找有没有对该 artifactId 和 groupId 进行过版本声明。如果有,就继承它;如果没有就会报错,必须为 dependency 声明一个 version 。
- 如果 <dependencies> 中的 <dependency> 声明了 <version> , 那么无论 <dependencyManagement> 中有无对该jar的 version 声明, 都以 dependency 里面的为准.
项目构建
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.weishuo.demo01.Demo01Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在Maven的pom.xml文件中,存在如下两种构建相关的配置 <build> :
(1) 全局配置(project build) :针对整个项目的所有情况都有效
(2) 配置(profile build) :针对不同的profile配置
以上这段pom文件,主要定义了 < plugins> ,用于指定使用的插件:
(1)maven-compiler-plugin插件
如果我们不告诉maven:代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配的问题,以至于可能导致编译不通过的问题。为了处理这一种情况的出现,在构建maven项目的时候,就是要配置maven-compiler-plugin插件。
(2)spring-boot-maven-plugin插件
Spring Boot Maven plugin能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。
plugin可以有多个执行目标,每一个目标 <execution> 都有一个分开的配置,可以将执行目标绑定到不同的maven阶段。
Spring Boot Maven plugin的最主要goal就是 repackage ,其在Maven的package生命周期阶段,能够将 mvn package 生成的软件包,再次打包为可执行的软件包,并将 mvn package 生成的软件包重命名为 *.original 。
基于上述配置,对一个生成Jar软件包的项目执行如下命令
mvn package spring-boot:repackage
可以看到生成的两个jar文件,一个是*.jar,另一个是*.jar.original。
至此,一个刚创建的SpringBoot项目的POM文件的内容就介绍完了。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。