V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gransh
V2EX  ›  Java

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

  •  1
     
  •   gransh · 2018-12-14 12:30:36 +08:00 · 7495 次点击
    这是一个创建于 1931 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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。这又是为什么呢?
    27 条回复    2018-12-18 13:32:35 +08:00
    yidinghe
        1
    yidinghe  
       2018-12-14 12:32:45 +08:00
    war 包是放在容器( Tomcat )里面运行的,很多东西都会交给容器来决定,比如端口和访问上下文路径。war 包不能自己决定端口号和上下文路径。
    Tyanboot
        2
    Tyanboot  
       2018-12-14 12:53:47 +08:00
    打包成 jar 的时候内嵌了 tomcat,server.port 只是设置了这个内嵌的 tomcat 的端口。换成 war 这个内嵌的 tomcat 就不会运行了,自然端口号是外部容器决定的。
    gransh
        3
    gransh  
    OP
       2018-12-14 13:14:55 +08:00
    @Tyanboot 我了解到 jar 是比 war 更轻量包含的东西更少,既然 jar 可以直接运行了,为什么我们还需要打包成 war 放进 tomcat 里这种方式呢
    YUyu101
        4
    YUyu101  
       2018-12-14 13:35:43 +08:00
    jar 包自带 tomcat 了,打包前就写好配置了,war 包只有内容。
    qwx
        5
    qwx  
       2018-12-14 13:37:29 +08:00
    tomcat 只是多种容器中的一种,其实还有其他容器可选。
    bobuick
        6
    bobuick  
       2018-12-14 13:40:03 +08:00
    很多年前,没得选择。打包成 war 放容器里是标准做法。
    后来 Spring 雄起,boot 雄起把 tomcat,jetty 之类的包在 jar 包内了。
    zjsxwc
        7
    zjsxwc  
       2018-12-14 13:40:46 +08:00 via Android
    之前讨论过,结论是开多个网站时,用 war 包更省内存
    yidinghe
        8
    yidinghe  
       2018-12-14 13:43:41 +08:00
    另外打包命令不是 mvn install 而是 mvn package。建议找些文章重新了解一下 Maven 项目生命周期。
    romisanic
        9
    romisanic  
       2018-12-14 13:45:40 +08:00
    mvn install 的时候 会把简单版的容器打包进去,相当于打包好的 jar 包包含了一个简单版本的 tomcat 或者 jetty
    red0range
        10
    red0range  
       2018-12-14 13:46:42 +08:00
    因为 springboot 里面自带 tomcat web 服务器
    aa6563679
        11
    aa6563679  
       2018-12-14 13:55:23 +08:00
    不用 Spring Cloud Netflix 时,可把多个 war 放到一个容器里,可以省一些内存
    C0dEr
        12
    C0dEr  
       2018-12-14 16:19:05 +08:00
    有个比较现实的问题是,如果你引用的 jar 包存在一些配置文件什么的,那用 fatjar 跑不起来,只能用 war
    BBCCBB
        13
    BBCCBB  
       2018-12-14 16:21:13 +08:00
    @C0dEr 为什么跑不起来? 还没遇到过跑不起来的呢
    gransh
        14
    gransh  
    OP
       2018-12-14 16:55:55 +08:00
    @yidinghe 在项目文件夹内打开命令行打包的 jar,就是这样
    qiyuey
        15
    qiyuey  
       2018-12-14 16:58:51 +08:00 via Android
    @C0dEr 比如说?
    zeroday
        16
    zeroday  
       2018-12-14 18:02:10 +08:00
    @qiyuey 比如 我要分别读取同前缀的文件.
    wenzhoou
        17
    wenzhoou  
       2018-12-14 18:26:18 +08:00 via Android
    @zeroday 这个听不懂。跳过。再比如说?
    xgfan
        18
    xgfan  
       2018-12-14 18:43:17 +08:00
    @C0dEr 这个问题不存在的。
    iyangyuan
        19
    iyangyuan  
       2018-12-14 20:39:47 +08:00 via iPhone
    配置文件使用 spring 注入的方式读取,不要自己写路径
    catinred
        20
    catinred  
       2018-12-14 21:16:19 +08:00
    Jar:内嵌了容器,并且可以通过配置来决定内嵌什么容器,比如 tomcat,jetty。
    War:需要部署到一个外部容器。
    按需求来决定打包方式。
    svt
        21
    svt  
       2018-12-15 11:40:00 +08:00
    借楼一问,,java 的项目,,,除了 tomcat 可以跑以外,还有别的什么的东西能跑 Java 的项目吗????
    qq515391365
        22
    qq515391365  
       2018-12-15 17:06:25 +08:00
    @svt jetty
    themis
        23
    themis  
       2018-12-15 21:56:58 +08:00
    @svt jetty, jboss, undertow, weblogic etc...
    abcbuzhiming
        24
    abcbuzhiming  
       2018-12-17 23:53:53 +08:00
    @svt jetty,Jboss,。建议你去理解一下 servlet 容器服务器的概念,只要实现了 servlet 容器的服务器都能跑基于 servlet 的 java web 程序
    abcbuzhiming
        25
    abcbuzhiming  
       2018-12-17 23:54:38 +08:00
    @catinred 其实你说的也不对,你一样可以 java -jar war 的方式跑起来,你可以去看看 jenkins。人家就是这么玩的
    abcbuzhiming
        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 服务器的呼声就起来了
    catinred
        27
    catinred  
       2018-12-18 13:32:35 +08:00
    @abcbuzhiming 这样的操作还是第一次听说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2943 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:08 · PVG 23:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.