spring boot 使用maven和fat jar/war运行应用程序的对比
文章目录
- 简介
- Spring Boot Maven Plugin
- 使用Maven命令来运行应用程序
- 作为fat jar/war包运行应用程序
- 详解War文件
- 详解jar文件
- 如何选择
使用maven和fat jar/war运行应用程序的对比
简介
上篇文章我们介绍了Spring boot的fat jar/war包,jar/war包都可以使用 java -jar 命令来运行,而maven也提供了mvn spring-boot:run 命令来运行应用程序,下面我们看看两者有什么不同。
Spring Boot Maven Plugin
上篇文章我们提到了Spring Boot Maven Plugin,通过使用该插件,可以有效的提高部署效率,并打包成为fat jar/war包。
在打包成fat jar/war包的时候,背后实际上做了如下的事情:
- 管理了classpath的配置,这样我们在运行java -jar的时候不用手动指定-cp 。
- 使用了自定义的ClassLoader来加载和定位所有的外部jar包依赖。并且所有的依赖jar包已经被包含在这个fat包里面了。
- 通过manifest自动查找main() ,这样我们就不需要在java -jar中手动指定main方法。
使用Maven命令来运行应用程序
要使用maven命令来运行应用程序可以在程序的根目录下面执行:
mvn spring-boot:run
它会自动下载所需要的依赖,并运行,运行日志如下:
mvn spring-boot:run
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.flydean:springboot-fatjar >--------------------
[INFO] Building springboot-fatjar 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) > test-compile @ springboot-fatjar >>>
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ springboot-fatjar ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ springboot-fatjar ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ springboot-fatjar ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ springboot-fatjar ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) < test-compile @ springboot-fatjar <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) @ springboot-fatjar ---
[INFO] Attaching agents: []
作为fat jar/war包运行应用程序
如果想打包成fat jar/war, 需要使用Maven Spring Boot plugin,如下所示,否则打包出来的jar包并不包含外部依赖:
<build><plugins>...<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>...</plugins>
</build>
如果我们的代码包含了多个main class, 需要手动指定具体使用哪一个, 有两种设置方式:
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><configuration><mainClass>com.flydean.FatJarApp</mainClass></configuration></execution></executions>
</plugin>
或者设置star-class属性:
<properties><start-class>com.flydean.FatJarApp</start-class>
</properties>
使用 mvn clean package 即可打包程序,然后使用java -jar target/springboot-fatwar-0.0.1-SNAPSHOT.war
即可运行。
详解War文件
将打包好的war文件解压,我们看下War文件的结构:
里面有三部分:
- META-INF, 里面包含有自动生成的MANIFEST.MF
- WEB-INF/classes, 包含了编译好的class文件
- WEB-INF/lib,包含了war的依赖jar包和嵌入的Tomcat jar包。
- WEB-INF/lib-provided,包含了embedded模式运行所需要但是在部署模式不需要的额外的依赖包。
- org/springframework/boot/loader,里面是Spring boot自定义的类加载器,这些类加载器负责加载外部依赖,并且使他们在运行时可用。
我们再看下MANIFEST.MF文件的内容:
Manifest-Version: 1.0
Implementation-Title: springboot-fatwar
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.flydean.FatWarApp
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.2.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.WarLauncher
主要关注两行:
Start-Class: com.flydean.FatWarApp
Main-Class: org.springframework.boot.loader.WarLauncher
一个是启动类就是我们自己写的,一个是main类这个是Spring boot自带的。
详解jar文件
我们再来看下jar文件:
jar文件和war文件有一点不同,没有WEB-INF,改成了BOOT-INF。
- 我们所有的自己的class都在BOOT-INF/classes下面。
- 外部依赖在BOOT-INF/lib下。
我们再看下MANIFEST.MF文件有什么不同:
Manifest-Version: 1.0
Implementation-Title: springboot-fatjar
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.flydean.FatJarApp
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.2.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.PropertiesLauncher
我们可以看到Start-Class还是一样的,但是Main-Class是不一样的。
如何选择
既然有两种方式来运行应用程序,一种是使用mvn命令,一种是使用fat jar/war文件,那我们该怎么选择呢?
通常情况下,如果我们是在线下的开发环境,可以直接使用mvn命令,mvn命令需要依赖于源代码,我们可以不断的修改源代码,方便开发。
如果是在线上环境,那么我们就需要使用fat jar/war了,这样的外部依赖比较小,我们不需要在线上环境部署maven环境,也不需要源代码,只要一个java的运行时环境就可以了。
本文的代码请参考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-fatwar
更多精彩内容且看:
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
- java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
更多教程请参考 flydean的博客
spring boot 使用maven和fat jar/war运行应用程序的对比相关推荐
- axure 小程序 lib_使用maven和fat jar/war运行应用程序的对比
简介 上篇文章我们介绍了Spring boot的fat jar/war包,jar/war包都可以使用 java -jar 命令来运行,而maven也提供了mvn spring-boot:run 命令来 ...
- Spring Boot使用maven打包成jar后将依赖jar一起打进jar文件
2019独角兽企业重金招聘Python工程师标准>>> <plugin> <groupId>org.springfra ...
- Spring boot的Maven插件(一):repackage目标
简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...
- Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解
Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...
- spring boot 本地maven手动添加pom.xml依赖
spring boot 本地maven手动添加pom.xml依赖 按照如下pom.xml配置,本地jar包可以正常使用,适用于maven仓库中没有的的jar包下载下来,手动添加依赖. <!-- ...
- Spring Boot 把 Maven 干掉了,正式拥抱 Gradle!
在国外某社交网站上有一个关于迁移 Spring Boot 迁移 Maven 至 Gradle 的帖子: 该贴子上也有很多人质疑:Maven 用的好好的,为什么要迁移至 Gradle? 虽然该贴子只是说 ...
- Spring boot的Maven配置依赖
Spring boot 的 Maven 配置依赖 springboot spring pom maven models 我们通过引用spring-boot-starter-parent,添加sprin ...
- JavaEE + Oracle + Spring Boot + Mybatis + Maven 开发简易版银行管理系统(附源码)
文章目录 JavaEE + Oracle + Spring Boot + Mybatis + Maven 开发简易版银行管理系统 一.系统介绍 二.开发步骤 三.系统展示 四.开发总结 五.数据库相关 ...
- Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 如果您已 ...
最新文章
- 转《刘润的数字化家庭》
- NeurIPS 2021论文放榜!清华投稿90篇排名第5,北大第9
- 吴恩达的二八定律:80%的数据+20%的模型=更好的机器学习
- 微软谈开源、赦盗版背后的商业逻辑
- Windows软件授权管理工具 slmgr命令详解
- android 自定义皮肤,Android Studio 自定义皮肤主题和背景
- python中数字应该用什么表示_Python
- keras 时间序列分析
- Telerik Reporting之生成报表
- 测试并发应用(七)配置Eclipse来调试并发代码
- python 打开pdf文件_Python3检验pdf文件是否有效
- Softmax的推导以及实现
- 了解 SWFObject 2.0 应用
- 一刀工具箱 - URL链接编码解码工具
- python中的snip用法_腾讯mac截图软件Snip使用教程
- 李开复写给中国大学生的信
- linux海报制作软件,用 OpenOffice.org 3.2 Draw 制作海报
- CAN总线学习笔记(1)- CAN基础知识
- CentOS 7 忘记root密码重置密码
- 原研哉:设计是什么?