
3.2 项目运行打包
3.2.1 Spring Boot项目编译打包
任何一个Spring Boot项目的pom.xml文件都存在一个特殊的插件——spring-boot-maven-plugin。插件声明代码如下:

此插件主要提供了与Spring Boot相关的一些功能,本节主要使用spring-boot:repackage功能。假定该插件不存在(先注释掉上述代码),并选择coupon-calculation-service为测试项目。
进入该项目的根目录,运行mvn package命令,并查看target目录,输出内容如下所示:

根据target目录下的内容可知,编译与打包都已经成功完成。如果直接使用Java命令运行前述步骤打包出的jar文件,则会导致启动失败。
根据以上测试可以得出结论,直接利用原始的Maven打包命令将无法得到可执行jar文件。而Spring Boot打包插件的目的就是将项目打包为可执行的jar文件。
然后,我们使用打包插件对项目进行打包(取消插件声明代码的注释),运行如下命令:

此时,会出现一个错误:

repackage goal是专门用于打包Spring Boot项目的插件,为什么使用它也无法打包成功?这是因为上述代码中,repackage是基于原始jar文件来产生Spring Boot可执行文件的,它并不具备直接从头构建jar的能力。因此,需要先利用mvn编译工具产生原始jar文件(即先运行mvn package),再运行repackage构建可执行的Spring Boot jar文件。编译打包的完整命令如下:

执行命令完毕后,查看target目录,其内容如下所示:

上述目录中包含了一个名为jar.original的文件,此文件与第一次测试(无plugin)编译出的jar文件大小相差无几(可近似为原生jar),但通过插件打包出的jar文件大小却差别很大,而且可以直接运行。这就是repackage的功能,它基于原始jar文件,将运行期的依赖都打包进新的jar文件,并辅以相应措施,以此让新的jar文件可以直接运行。
事实上,repackage是Spring Boot plugin的默认goal,因此可以将打包命令简化为:

这与完整命令是等效的。
3.2.2 运行Spring Boot项目
在了解了如何打包Spring Boot项目之后,Spring Boot项目应当如何运行呢?运行一个Spring Boot项目的方法有很多种,本节将一一展示。
3.2.2.1 IDE运行
在IDE中运行Spring Boot非常简单且直观,选择对应项目的main class直接运行即可。那么应当如何找到一个项目的main class呢?很简单,我们可以查看该项目的源代码,如果一个class上既有SpringBootApplication的注释,同时又有main()方法,那么这个class就是该项目的main class。以coupon-calculation-service为例,我们可以很方便地定位并运行其main class,如图3-2所示。
但是,以这种默认的方式运行Spring Boot项目,将无法指定运行期参数(例如profile),如果需要指定这些参数,应该如何操作呢?
在IntelliJ中,先选择Run菜单,再单击Edit Configurations选项卡,最后在编辑界面中选择要运行的class,在VM参数中添加相应的spring boot profile参数或程序参数,如图3-3所示。

图3-2 从IDE运行Spring Boot

图3-3 添加运行参数
3.2.2.2 Maven运行
Spring Boot项目也可以通过Maven直接运行,它的运行能力同样源自Spring Boot插件。要使用Maven运行项目,只需在Spring Boot项目的根目录下运行以下命令:

指定profile并加上对应的JVM参数的命令如下:

除此之外,还有一种Maven的运行方式,命令如下:

如果仅考虑运行项目,那么二者并无明显区别,但实际效果却截然不同,spring-boot:run是将项目作为一个可发布版本的形式运行,即此时针对该项目的任何操作都不被允许。因此,如果在开发过程中需要对程序进行不断的调整,那么推荐使用spring-boot:start。
3.2.2.3 Java运行
任何Java程序都可以通过Java命令来运行,基于Spring Boot的程序应当如何直接使用Java命令运行呢?在经过Maven编译打包之后,将在target目录下产生一个可执行jar文件,可以直接用Java命令运行该jar文件,命令如下:
