axure 小程序 lib_使用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包的时候,背后实际上做了如下的事情:

  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文件的结构:

6598a2dac20d50d8aba87fdd05ee034e.png

里面有三部分:

  • 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文件:

860e1134777bdbf1a107915a5c515e39.png

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的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VLAN端口转发原则

VLAN端口转发原则 1.Access端口转发原则 当Access端口收到帧时 如果该帧不包含802.1Q tag header&#xff0c;将打上端口的PVID&#xff1b; 如果该帧包含802.1Q tag header&#xff0c;交换机不作处理&#xff0c;直接丢弃。 当Access端口发送帧时 剥离802.1Q tag header…

新版opencv兼容旧版_【标准换版】关于家用和类似用途电器用外置电源适配器、充电器和内置开关电源产品认证执行新版标准的通知...

各相关认证企业&#xff1a;GB4343.1-2018《家用电器、电动工具和类似器具的电磁兼容要求 第1部分&#xff1a;发射》标准&#xff08;以下简称“新版标准”&#xff09;已发布&#xff0c;并将于2020年6月1日实施&#xff0c;新版标准自实施之日起替代GB4343.1-2009标准&#…

html万花筒照片代码,怎样拍出万花筒效果

ipadair相机怎么拍出万花筒的效果我这边是ipad3&#xff0c;不过应该和air差不多&#xff0c;有一个photo booth&#xff0c;里面有个万花筒效果照相&#xff0c;点那个进去照相就好了。制作前的准备工作 尽量使用最简单的工具 1 镜子&#xff1a;你可以去玻璃店购买些镜子的边…

delay 芯片时序output_【第二章 STA概念 上】静态时序分析圣经翻译计划

本文由知乎赵俊军授权转载&#xff0c;知乎主页为https://www.zhihu.com/people/zhao-jun-jun-19本章节介绍CMOS技术的基础知识以及执行静态时序分析所涉及的术语。2.1 CMOS逻辑设计2.1.1 基本MOS结构MOS晶体管(NMOS和PMOS)的物理实现如图2-1所示。源极(source)和漏极(drain)区…

html播放七牛云视频,直传七牛云视频播放商业版【价值199元】

福利&#xff1a;本资源正在众筹中&#xff0c;如贴内有下载链接则已众筹成功可下载资源&#xff0c;否则暂无资源&#xff0c;你可以在官方购买此资源后&#xff0c;用于【交换】魔趣吧内已发布的其他你需要的极品资源&#xff01;这样你既可以买到自己想要的资源&#xff0c;…

数码管显示实验一 编写程序让8只数码管同时显示零

编写程序让数码管同时显示零 此实验是共阳极写法 程序&#xff1a; #include <reg51.h> unsigned char segment[] {0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; unsigned char k0; int main(void) { TMOD0x00; TL0(8192-2000)%32; TH0(8192-2000)/256; TR01; EA1…

andpods授权码订单号分享_微信OAuth2授权登录

前言 第三方登录是应用开发中的常用功能&#xff0c;通过第三方登录&#xff0c;我们可以更加容易使用户登录我们的应用或者网站。很多网站都提供了第三方登录的功能&#xff0c;在他们的官网中&#xff0c;都提供了如何接入第三方登录的文档。但是&#xff0c;假如不同的网站文…

让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示

让8只数码管初始显示零&#xff0c;每隔大约1s加一显示&#xff0c;到数码管显示9后&#xff0c;再从一开始显示 用延时函数实现加一显示 程序&#xff1a; #include <reg51.h> void delay(unsigned char n); int main(void) { unsigned char led[]{0xC0,0xF9,0xA4,0xB…

计算机项目经理专业,IT项目经理的对口专业

IT项目经理的对口专业IT项目经理是从事IT计算机相关的项目管理人员&#xff0c;IT项目经理需要具有一定的专业能力和管理能力&#xff0c;是一个较为高端的职位。有朋友问&#xff1a;IT项目经理的对口专业是什么?下面我们给大家介绍一下。如今&#xff0c;在互联网蓬勃发展的…

让8只数码管从左往右显示1、2、3、4、、、8

编写实验学习数码管动态显示&#xff0c;让8只数码管从左往右显示1,2&#xff0c;3,4&#xff0c;&#xff0c;&#xff0c;8 程序&#xff1a; #include <reg51.h> unsigned char led[]{0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//0-9的字型码 unsigned char segment[…

miracast投屏软件下载_手机画面如何投屏到电视?

投屏方法详解&#xff0c;拆解步骤&#xff0c;视频演示&#xff0c;讲到你会用为止&#xff01;安卓手机Miracast镜像安卓手机Miracast镜像可谓刚需&#xff0c;这种镜像方式的一大优点就是手机端不用再另装其他软件&#xff0c;电视端有“爱投屏”即可流畅使用。步骤如下&…

iec61131 3 html5,IEC61131-3{ed3.0}标准资料.doc

IEC61131-3{ed3.0}标准资料IEC 61131-3?Edition 3.0 2013-02INTERNATIONALSTANDARDNORMEINTERNATIONALEProgrammable controllers –Part 3: Programming languagesAutomates programmables –Partie 3: Langages de programmationTHIS PUBLICATION IS COPYRIGHT PROTECTEDCop…

外部中断实验 编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。

编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮&#xff0c;有外部中断请求时&#xff0c;4位数码管从0000开始加1显示(加到9999后复位为0000)&#xff0c;同时蜂鸣器报警。 程序&#xff1a; #include<reg51.h> #define uchar unsigne…

flash一个按钮控制动画_PLC三组灯用一个按钮控制

今天作一个PLC小练习用一个按钮控制三组或三个灯,以达到控制灯的亮度,由PLC组成一个控制器,每按一次按钮增加一组灯亮,三组灯全亮后,每按一次按钮,灭一组灯(为了使每组灯亮的时间尽量相等,要求先亮的灯先灭),如果按下按钮的时间超过2S,则灯全灭.模拟练习设M600.0是按钮1M800.0是…

51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

设置中断优先级寄存器&#xff0c;当有外部中断0请求中断时&#xff0c;中断程序执行发光二极管程序&#xff0c;在此过程中&#xff0c;外部中断1也有中断请求&#xff0c;外部中断0的中断程序将被中断去执行外部中断1的中断程序&#xff08;数码管加1显示程序&#xff09;。 …

下载 6g 概念及愿景白皮书_6G,到底有多6?6G概念及愿景白皮书正式发布!

近日赛迪智库正式发布《6G概念及愿景白皮书》白皮书从6G愿景、6G应用场景6G网络性能指标、6G潜在关键技术国际组织和各国6G研究进展等方面展开讨论并提出加快我国推进6G研发的相关建议以为业界在面向2030网络及6G研究方面提供重要参考话又说回来6G究竟是个啥6G&#xff0c;即第…

html如何创建关键帧动画旋转,[教程] 用 CSS3 Animations(动画) 和 Keyframes(关键帧) 创建简单的网页动画 – CSS3 实现弹跳球动画...

通过这个有趣的教程学习 CSS Animations(动画) 和 Keyframes(关键帧)。我们要做什么&#xff1f;下面是最终代码&#xff0c;也就是我们将要最终实现的演示&#xff1a;基础准备对于这个实现&#xff0c;我们需要一个简单的 div &#xff0c;并且样式类名为 ball &#xff1a;我…

定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。

编写程序使定时器0或者定时器1工作在方式1&#xff0c;定时50ms触发蜂鸣器。 程序&#xff1a; #include<reg51.h> sbit fmP2^3; unsigned char cnt; int main(void) { TMOD0x01; TH0(65536-46083)/256; TL0(65536-46083)%256; cnt0; TR01; EA1; ET01; while(1); } void …

python绘制如下图形、小三角形边长20_python二级操作题与分析(7)

1.基本操作题 (1) 从键盘输入 3 个数作为三角形的边长&#xff0c;在屏幕上显示输出由这 3 个边长构成三角形的面积&#xff08;保留 2 位小数&#xff09;。 请参照代码模板&#xff0c;完善代码。 输入输出示例 输入输出 示例 1 3,3,3 3.90 习题讲解 a,b,c eval(input()) p …

NPM 的使用技巧:简化 JavaScript 开发和依赖管理

前言 NPM&#xff08;Node Package Manager&#xff09;是 JavaScript 生态系统中最流行的包管理工具之一。本文将介绍一些有用的 NPM 使用技巧&#xff0c;帮助开发者更好地利用 NPM 管理项目依赖、执行脚本、发布自己的包以及解决常见问题。 1. 初始化项目 使用 NPM 初始化…