关于 springboot 项目的 jar 和 war 两种打包方式部署的区别?

2018-12-14 12:30:36 +08:00
 gransh
1.我的一个 springboot 项目,用 mvn install 打包成 jar,换一台有 jdk 的机器就直接可以用 java -jar 项目名.jar 的方式运行,没任何问题,为什么这里不需要 tomcat 也可以运行了?

2.然后我打包成 war 放进 tomcat 运行,发现端口号变成 tomcat 默认的 8080 (我在 server.port 中设置端口 8090 )项目名称也必须加上了。
也就是说我在原来的机器的 IDEA 中运行,项目接口地址为 ip:8090/listall,打包放进另一台机器的 tomcat 就变成了 ip:8080/项目名 /listall。这又是为什么呢?
7680 次点击
所在节点    Java
27 条回复
yidinghe
2018-12-14 12:32:45 +08:00
war 包是放在容器( Tomcat )里面运行的,很多东西都会交给容器来决定,比如端口和访问上下文路径。war 包不能自己决定端口号和上下文路径。
Tyanboot
2018-12-14 12:53:47 +08:00
打包成 jar 的时候内嵌了 tomcat,server.port 只是设置了这个内嵌的 tomcat 的端口。换成 war 这个内嵌的 tomcat 就不会运行了,自然端口号是外部容器决定的。
gransh
2018-12-14 13:14:55 +08:00
@Tyanboot 我了解到 jar 是比 war 更轻量包含的东西更少,既然 jar 可以直接运行了,为什么我们还需要打包成 war 放进 tomcat 里这种方式呢
YUyu101
2018-12-14 13:35:43 +08:00
jar 包自带 tomcat 了,打包前就写好配置了,war 包只有内容。
qwx
2018-12-14 13:37:29 +08:00
tomcat 只是多种容器中的一种,其实还有其他容器可选。
bobuick
2018-12-14 13:40:03 +08:00
很多年前,没得选择。打包成 war 放容器里是标准做法。
后来 Spring 雄起,boot 雄起把 tomcat,jetty 之类的包在 jar 包内了。
zjsxwc
2018-12-14 13:40:46 +08:00
之前讨论过,结论是开多个网站时,用 war 包更省内存
yidinghe
2018-12-14 13:43:41 +08:00
另外打包命令不是 mvn install 而是 mvn package。建议找些文章重新了解一下 Maven 项目生命周期。
romisanic
2018-12-14 13:45:40 +08:00
mvn install 的时候 会把简单版的容器打包进去,相当于打包好的 jar 包包含了一个简单版本的 tomcat 或者 jetty
red0range
2018-12-14 13:46:42 +08:00
因为 springboot 里面自带 tomcat web 服务器
aa6563679
2018-12-14 13:55:23 +08:00
不用 Spring Cloud Netflix 时,可把多个 war 放到一个容器里,可以省一些内存
C0dEr
2018-12-14 16:19:05 +08:00
有个比较现实的问题是,如果你引用的 jar 包存在一些配置文件什么的,那用 fatjar 跑不起来,只能用 war
BBCCBB
2018-12-14 16:21:13 +08:00
@C0dEr 为什么跑不起来? 还没遇到过跑不起来的呢
gransh
2018-12-14 16:55:55 +08:00
@yidinghe 在项目文件夹内打开命令行打包的 jar,就是这样
qiyuey
2018-12-14 16:58:51 +08:00
@C0dEr 比如说?
zeroday
2018-12-14 18:02:10 +08:00
@qiyuey 比如 我要分别读取同前缀的文件.
wenzhoou
2018-12-14 18:26:18 +08:00
@zeroday 这个听不懂。跳过。再比如说?
6IbA2bj5ip3tK49j
2018-12-14 18:43:17 +08:00
@C0dEr 这个问题不存在的。
iyangyuan
2018-12-14 20:39:47 +08:00
配置文件使用 spring 注入的方式读取,不要自己写路径
catinred
2018-12-14 21:16:19 +08:00
Jar:内嵌了容器,并且可以通过配置来决定内嵌什么容器,比如 tomcat,jetty。
War:需要部署到一个外部容器。
按需求来决定打包方式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/517503

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX