![微服务从小白到专家:Spring Cloud和Kubernetes实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/981/41202981/b_41202981.jpg)
3.2 项目运行打包
3.2.1 Spring Boot项目编译打包
任何一个Spring Boot项目的pom.xml文件都存在一个特殊的插件——spring-boot-maven-plugin。插件声明代码如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/099-3.jpg?sign=1739420519-Zu7DeC4bcOx6ztlmZmr9ZUamNmZvCJZS-0-afd4f0ec73cf824dc4bc705a19ec8740)
此插件主要提供了与Spring Boot相关的一些功能,本节主要使用spring-boot:repackage功能。假定该插件不存在(先注释掉上述代码),并选择coupon-calculation-service为测试项目。
进入该项目的根目录,运行mvn package命令,并查看target目录,输出内容如下所示:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-2.jpg?sign=1739420519-mqqTvQiIBols9LMqIPUlH3vBfXN7bic7-0-96a7d1f9412f4ebc7cfdf0cfe379a25c)
根据target目录下的内容可知,编译与打包都已经成功完成。如果直接使用Java命令运行前述步骤打包出的jar文件,则会导致启动失败。
根据以上测试可以得出结论,直接利用原始的Maven打包命令将无法得到可执行jar文件。而Spring Boot打包插件的目的就是将项目打包为可执行的jar文件。
然后,我们使用打包插件对项目进行打包(取消插件声明代码的注释),运行如下命令:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-3.jpg?sign=1739420519-jXGT7VfYOgx7UdJPRA1K1TjdhgiyTOlr-0-b89bc65d41b6f536672a58d9682f003f)
此时,会出现一个错误:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-4.jpg?sign=1739420519-NZhALZDsm1UhL8Sn9hSWfuBKMWH8PBCy-0-01498143f64aec82fed5948dd05687cd)
repackage goal是专门用于打包Spring Boot项目的插件,为什么使用它也无法打包成功?这是因为上述代码中,repackage是基于原始jar文件来产生Spring Boot可执行文件的,它并不具备直接从头构建jar的能力。因此,需要先利用mvn编译工具产生原始jar文件(即先运行mvn package),再运行repackage构建可执行的Spring Boot jar文件。编译打包的完整命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/101-1.jpg?sign=1739420519-AqFUAyPV48gbMsjriJxWvvrjmTmNHqud-0-21b48a64dfb0d671f8ac391d1930ca2b)
执行命令完毕后,查看target目录,其内容如下所示:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/101-2.jpg?sign=1739420519-5dORjQoZgRShHBL89MBZZVLidXXfoOdH-0-b81fd42032471b0a79f48627da5f87ae)
上述目录中包含了一个名为jar.original的文件,此文件与第一次测试(无plugin)编译出的jar文件大小相差无几(可近似为原生jar),但通过插件打包出的jar文件大小却差别很大,而且可以直接运行。这就是repackage的功能,它基于原始jar文件,将运行期的依赖都打包进新的jar文件,并辅以相应措施,以此让新的jar文件可以直接运行。
事实上,repackage是Spring Boot plugin的默认goal,因此可以将打包命令简化为:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/101-3.jpg?sign=1739420519-bT3Xu2JhrAvuQqOJHgGLazOvR1PP3vQv-0-c10be0f1a3dd238583fcc9354f207a23)
这与完整命令是等效的。
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所示。
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/102-1.jpg?sign=1739420519-pD6wpR0iDaeABjAg3b1A6E03jLqTOftr-0-f7127e5714d3f428666e083e790e9fb8)
图3-2 从IDE运行Spring Boot
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/102-2.jpg?sign=1739420519-dHXMWhBNMcKwm3LGRBcns23WLkN2ftP5-0-b107e9a232df178860e4c6f16b808972)
图3-3 添加运行参数
3.2.2.2 Maven运行
Spring Boot项目也可以通过Maven直接运行,它的运行能力同样源自Spring Boot插件。要使用Maven运行项目,只需在Spring Boot项目的根目录下运行以下命令:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-1.jpg?sign=1739420519-SUtvW3MLVF6MKBbZyrpi45omf6FT62OP-0-25830e9be877e78ab262c83499169b1b)
指定profile并加上对应的JVM参数的命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-2.jpg?sign=1739420519-dFxeLPLMVjpgrTW3LPlN4Jmyq7bPEmL0-0-05f1f3a7ec8f3f4b11534b09044e36a3)
除此之外,还有一种Maven的运行方式,命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-3.jpg?sign=1739420519-2RLmqIxwMGEaaNtW5aIcV9dI7kVTVAJM-0-825dba2db41f5de143de0098f5541d81)
如果仅考虑运行项目,那么二者并无明显区别,但实际效果却截然不同,spring-boot:run是将项目作为一个可发布版本的形式运行,即此时针对该项目的任何操作都不被允许。因此,如果在开发过程中需要对程序进行不断的调整,那么推荐使用spring-boot:start。
3.2.2.3 Java运行
任何Java程序都可以通过Java命令来运行,基于Spring Boot的程序应当如何直接使用Java命令运行呢?在经过Maven编译打包之后,将在target目录下产生一个可执行jar文件,可以直接用Java命令运行该jar文件,命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-4.jpg?sign=1739420519-9MAOe2gmxQVeJfKAn1q4aQJ8JauqCjnd-0-0172cf4c2f7244eab74a4b91b2ae3d02)