- 微服务从小白到专家:Spring Cloud和Kubernetes实战
- 姚秋辰 张昕 卿睿
- 1264字
- 2021-10-29 12:24:26
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=1739024408-afr6OTqQIidROSaoyNdN41uMIfUsCOJW-0-72c54a82c3fd2e91caad0ae5900f0c31)
此插件主要提供了与Spring Boot相关的一些功能,本节主要使用spring-boot:repackage功能。假定该插件不存在(先注释掉上述代码),并选择coupon-calculation-service为测试项目。
进入该项目的根目录,运行mvn package命令,并查看target目录,输出内容如下所示:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-2.jpg?sign=1739024408-6GTPRuv4Uk3edpjwR0FdjQFNq9ctHhq6-0-3abd43c9497825621b28f18e072272ef)
根据target目录下的内容可知,编译与打包都已经成功完成。如果直接使用Java命令运行前述步骤打包出的jar文件,则会导致启动失败。
根据以上测试可以得出结论,直接利用原始的Maven打包命令将无法得到可执行jar文件。而Spring Boot打包插件的目的就是将项目打包为可执行的jar文件。
然后,我们使用打包插件对项目进行打包(取消插件声明代码的注释),运行如下命令:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-3.jpg?sign=1739024408-0G6krb4BfOXM5jVcWk05i5hbHUlA5ABX-0-51c815fa71ece6603b2de5c32d27c8c2)
此时,会出现一个错误:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/100-4.jpg?sign=1739024408-o9N9YTBpo6oblUgjkm1z8CJl0KpnTDJL-0-5f2b1fbfc6506c312b4603e26c674162)
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=1739024408-UXRFzStIS6wgyCRIW2dDprtP5NyWn2DR-0-571459da2d2c31c709742999599bac4d)
执行命令完毕后,查看target目录,其内容如下所示:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/101-2.jpg?sign=1739024408-eyGfGpMRW1TqR7P1jScu1MI4J9STds8G-0-8b14d7ed3d4204561606e20c6434638d)
上述目录中包含了一个名为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=1739024408-MMYsWSkfp0Na7h8n39YOKwAqfctT3PBD-0-72a1abec17bdc54c135aa27b703255b5)
这与完整命令是等效的。
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=1739024408-MnQQgpiZ1vwCNjlvj3YyhcnKNPVp9iQR-0-a0fcaf7981f3b9d0db216fffe495d053)
图3-2 从IDE运行Spring Boot
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/102-2.jpg?sign=1739024408-8MnoLhofkVMPSJ1D69tPMgbBDEgWFIQe-0-68effbe29874d1771bd69dc34d07ab72)
图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=1739024408-p26BUOKs9Jy3TFfpadFXXFNM1IwrWJVP-0-fd8434152e97f6647b1828600ee8a408)
指定profile并加上对应的JVM参数的命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-2.jpg?sign=1739024408-CZdodKxD1NJcef09uCHmp9SbZrIatNDy-0-c5a37f8284ab5aa30e14382dd9410fbb)
除此之外,还有一种Maven的运行方式,命令如下:
![](https://epubservercos.yuewen.com/91A00C/21440188001525406/epubprivate/OEBPS/Images/103-3.jpg?sign=1739024408-DQDEVBCdhHyYbNpLUQdo4mZcfhpxiUll-0-bac19483697542894fb678ac9fdfd3d5)
如果仅考虑运行项目,那么二者并无明显区别,但实际效果却截然不同,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=1739024408-dYGcOGuUMNvPDwfwE5Sms7Vj2n1gDvJp-0-ef00aa5f67f1f8476ee3adf470e58978)