1
yidinghe 2018-12-14 12:32:45 +08:00
war 包是放在容器( Tomcat )里面运行的,很多东西都会交给容器来决定,比如端口和访问上下文路径。war 包不能自己决定端口号和上下文路径。
|
2
Tyanboot 2018-12-14 12:53:47 +08:00
打包成 jar 的时候内嵌了 tomcat,server.port 只是设置了这个内嵌的 tomcat 的端口。换成 war 这个内嵌的 tomcat 就不会运行了,自然端口号是外部容器决定的。
|
3
gransh OP @Tyanboot 我了解到 jar 是比 war 更轻量包含的东西更少,既然 jar 可以直接运行了,为什么我们还需要打包成 war 放进 tomcat 里这种方式呢
|
4
YUyu101 2018-12-14 13:35:43 +08:00
jar 包自带 tomcat 了,打包前就写好配置了,war 包只有内容。
|
5
qwx 2018-12-14 13:37:29 +08:00
tomcat 只是多种容器中的一种,其实还有其他容器可选。
|
6
bobuick 2018-12-14 13:40:03 +08:00
很多年前,没得选择。打包成 war 放容器里是标准做法。
后来 Spring 雄起,boot 雄起把 tomcat,jetty 之类的包在 jar 包内了。 |
7
zjsxwc 2018-12-14 13:40:46 +08:00 via Android
之前讨论过,结论是开多个网站时,用 war 包更省内存
|
8
yidinghe 2018-12-14 13:43:41 +08:00
另外打包命令不是 mvn install 而是 mvn package。建议找些文章重新了解一下 Maven 项目生命周期。
|
9
romisanic 2018-12-14 13:45:40 +08:00
mvn install 的时候 会把简单版的容器打包进去,相当于打包好的 jar 包包含了一个简单版本的 tomcat 或者 jetty
|
10
red0range 2018-12-14 13:46:42 +08:00
因为 springboot 里面自带 tomcat web 服务器
|
11
aa6563679 2018-12-14 13:55:23 +08:00
不用 Spring Cloud Netflix 时,可把多个 war 放到一个容器里,可以省一些内存
|
12
C0dEr 2018-12-14 16:19:05 +08:00
有个比较现实的问题是,如果你引用的 jar 包存在一些配置文件什么的,那用 fatjar 跑不起来,只能用 war
|
18
6IbA2bj5ip3tK49j 2018-12-14 18:43:17 +08:00
@C0dEr 这个问题不存在的。
|
19
iyangyuan 2018-12-14 20:39:47 +08:00 via iPhone
配置文件使用 spring 注入的方式读取,不要自己写路径
|
20
catinred 2018-12-14 21:16:19 +08:00
Jar:内嵌了容器,并且可以通过配置来决定内嵌什么容器,比如 tomcat,jetty。
War:需要部署到一个外部容器。 按需求来决定打包方式。 |
21
svt 2018-12-15 11:40:00 +08:00
借楼一问,,java 的项目,,,除了 tomcat 可以跑以外,还有别的什么的东西能跑 Java 的项目吗????
|
22
qq515391365 2018-12-15 17:06:25 +08:00
@svt jetty
|
24
abcbuzhiming 2018-12-17 23:53:53 +08:00
@svt jetty,Jboss,。建议你去理解一下 servlet 容器服务器的概念,只要实现了 servlet 容器的服务器都能跑基于 servlet 的 java web 程序
|
25
abcbuzhiming 2018-12-17 23:54:38 +08:00
@catinred 其实你说的也不对,你一样可以 java -jar war 的方式跑起来,你可以去看看 jenkins。人家就是这么玩的
|
26
abcbuzhiming 2018-12-18 00:08:03 +08:00
哎,现在学编程的基本都不会教历史了,也没人有兴趣去钻研。总体来说吧,很多年前,Sun 还在世的那个年代,在度过了早期用 C++写 Html 解析器的蛮荒时期后,有一批最早的脚本程序进入了 cgi 时代,此时的 Sun 决定进军这个领域,为了以示区别并显得自己高大上,于是研发了 servlet 标准,搞出了最早的 jsp。并给自己起了个高大上的称号 JavaEE ( Java 企业级应用标准,我呸,不就是一堆服务器以 http 提供服务吗,吹逼)。既然是企业级标准那自然得有自己的服务器标准。于是 Servlet 标准诞生,以此标准实现的服务器称为 Servle 容器服务器,Tomcat 就是其中代表,被 Sun 捐献给了 Apache 基金会,那个时候的 Web 服务器还是个高大上的概念,当时的 Java Web 程序的标准就是 War 包(其实就是个 Zip 包),这就是 War 包的由来。后来随着服务器领域的屡次进化,人们发现我们为什么要这么笨重的 Web 服务器,还要实现一大堆 Servlet 之外的管理功能,简化一下抽出核心概念 servlet 不是更好吗,最早这么干的似乎是 Jetty,出现了可以内嵌的 Servelet 服务器。去掉了一大堆非核心功能。后来 tomcat 也跟进了,再后来,本来很笨重的传统 JavaEE 服务器 Jboss 也搞了个 undertow 来凑热闹。正好这个时候微服务的概念兴起,“ use Jar,not War ”。要求淘汰传统 Servlet 服务器的呼声就起来了
|
27
catinred 2018-12-18 13:32:35 +08:00
@abcbuzhiming 这样的操作还是第一次听说
|