简介

上篇文章我们介绍了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包的时候,背后实际上做了如下的事情:

  1. 管理了classpath的配置,这样我们在运行java -jar的时候不用手动指定-cp 。
  2. 使用了自定义的ClassLoader来加载和定位所有的外部jar包依赖。并且所有的依赖jar包已经被包含在这个fat包里面了。
  3. 通过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>

如果我们的代码包含了多个main class, 需要手动指定具体使用哪一个, 有两种设置方式:

<plugin>

或者设置star-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

更多教程请参考 flydean的博客

axure 小程序 lib_使用maven和fat jar/war运行应用程序的对比相关推荐

  1. spring boot 使用maven和fat jar/war运行应用程序的对比

    文章目录 简介 Spring Boot Maven Plugin 使用Maven命令来运行应用程序 作为fat jar/war包运行应用程序 详解War文件 详解jar文件 如何选择 使用maven和 ...

  2. scala语言编写的maven项目打jar包运行

    项目场景: scala语言编写的maven项目打jar包运行 问题描述 最近在做项目的时候需要把项目部署到docker上面运行,java.编写的maven项目打成jar包再定义入口函数之后就可以运行了 ...

  3. python编程在哪里写程序-教你如何编写、保存与运行Python程序的方法

    第一步 接下来我们将看见如何在 Python 中运行一个传统的"Hello World"程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Pyth ...

  4. Linux中的mate程序的进程,终端下以后台模式运行Linux程序的过程详解

    这是一个简短但是非常有用的教程:它向你展示从终端运行Linux应用程序的同时,如何保证终端仍然可以操作. 在Linux中有许多方式可以打开一个终端,这主要取决于你的发行版的选择和桌面环境. Linux ...

  5. 要运行python程序要安装什么_windows下面如何安装运行python程序

    不管我们从事什么,总会遇到那么几个"难题",小编也是在不断的学习,那么今天我来讲:windows下面如何安装运行python程序? 工具/原料 电脑:联想拯救者Y7000 软件:P ...

  6. 安卓手机可以运行linux程序吗,重磅!安卓系统也能运行PC程序了,实测效果令人惊在当场!...

    原标题:重磅!安卓系统也能运行PC程序了,实测效果令人惊在当场! 一直以来,不少人都梦想着在手机上运行Windows系统,打开exe程序,让手机真正变成一部便携式微型计算机.然而,这个大一统的梦想即便 ...

  7. 服务器任务栏运行程序不见了,Win7系统任务栏上正在运行的程序图标不见了怎么办...

    操作Windows7系统过程中会发现桌面下角的一些正在运行的图标不见了,也不知道怎么回事?正常情况下,只要打开程序应用都会显示在任务上的.我们又重新打开一个新程序,又会提醒你已经在运行了.为什么会出现 ...

  8. maven testNG打成jar包运行报错repackage failed: Unable to find main class

    一.maven testNG如何打jar包 1.pom文件引入插件 <build><plugins><plugin><groupId>org.apach ...

  9. c语言程序在cmd,在windows命令行编译运行c程序

    第一步:打开命令行界面并且确认gcc.exe确实可用 键盘win + r ( 这里的r是run的意思) 输入cmd,回车,你就看到了命令行 输入gcc -v --如果返回了结果,那么继续,如果不识别, ...

最新文章

  1. 【实用主义】如何用nodejs自动定时发送邮件提醒?
  2. Java中switch都可以支持哪些数据类型
  3. 20145328《网络对抗》Web基础
  4. SAP算号器 license key Developer Access Key 完美解决方案
  5. 微服务架构:如何用十步解耦你的系统?
  6. React基础篇(六)React中绑定事件的注意点
  7. 怎么理解汉罗塔问题_小白理解的汉诺塔中的递归问题
  8. [转]解决xampp无法启动apache的问题
  9. SQL查找是否“存在“,别再count了!
  10. sap abap开发从入门到精通_Nginx 开发从入门到精通《实战书籍》学会这些就够了...
  11. RHEL 7 防火墙
  12. JS用图片制作的走动的时间表
  13. excel合并两列内容_一起来学习Excel表格两列合并一列的两种方法
  14. Python基于openCV火焰识别
  15. windows x86和x64的区别
  16. 如何设置线程池参数?美团给出了一个让面试官虎躯一震的回答。
  17. android 画图一
  18. linux 出现running guests on default URT情况解决
  19. 【pycharm】py文件开头注释如何设置?操作很简单一看就会
  20. Scrapy学习——爬取智联招聘网站案例

热门文章

  1. m1笔记本android开发,Apple M1设备开发Android小tips
  2. 字体选择_十分钟带你掌握精准选择字体的方法!
  3. linux添加用户命令_为Linux的cp和mv命令添加进度条
  4. mysql python is not installed_最全的解决安装MySQL-Python出现的问题: pip install MySQl-Python 出现:下列问题...
  5. java二期_JAVA基础之多线程二期
  6. java 弹出软键盘_Android开发之弹出软键盘工具类简单示例
  7. python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
  8. Win7系统网页视频无法播放怎么办
  9. 生物计算机的主要原材料是(),新材料为生物计算机打造“神经元”和“突触”...
  10. linux启动脚本卡住,linux 服务脚本启动问题