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

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

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