请问 SpringBoot 可以脱离 tomcat 单独跑么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuhuan66666
V2EX    问与答

请问 SpringBoot 可以脱离 tomcat 单独跑么

  •  
  •   yuhuan66666 2017-03-24 10:16:18 +08:00 27384 次点击
    这是一个创建于 3124 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想写个本地工程,用 SpringBoot 写 ,但是不依赖内置 tomcat 或者扔进 tomcat 里,就没办法持续运行。。。

    • 请问有什么办法能不依赖 tomcat 用 SpringBoot 写成本地工程么?

    • 有什么其他的框架可以像 SpringBoot 那种打成 jar 的 写一个本地工程吗?

    写 webx 写多了,本地工程都不知道该咋写了。。。

    谢谢各位

    第 1 条附言    2017-03-24 18:20:34 +08:00
    主要是想让 应用能常驻后台,但是现在的方案 都是没法常驻的
    54 条回复    2019-06-11 20:35:51 +08:00
    bk201
        1
    bk201  
       2017-03-24 10:19:44 +08:00
    无非还是内嵌容器比如
    Embedded Tomcat ,脱离容器的没遇到过。
    ihuotui
        2
    ihuotui  
       2017-03-24 10:29:36 +08:00 via iPhone
    你用 sevlert 吗?用 http 解析吗?
    vcfvct
        3
    vcfvct  
       2017-03-24 10:33:52 +08:00 via Android
    standalone 肯定支持的!没有 web 的 dependency 的话就不会把 embedded tc 打进去,所以其实用来写平时 utility jar 也很方便!我们最近还放在 AWS lambda 上 run 一些 task ,也挺好!
    zhuyao
        4
    zhuyao  
       2017-03-24 10:35:53 +08:00
    用 spring boot 不用 tomcat 那就没什么意义啊
    mkstring
        5
    mkstring  
       2017-03-24 10:37:30 +08:00
    可以的哟。打成 jar 包后直接运行 java -jar xx.jar 就可以了。
    yuhuan66666
        6
    yuhuan66666  
    OP
       2017-03-24 10:43:08 +08:00
    @ihuotui #2 额 其实不会用到 sevlert 的。。。就是本地应用
    reeco
        7
    reeco  
       2017-03-24 10:43:27 +08:00   1
    当然可以,只要你的应用不依赖 servlet
    yuhuan66666
        8
    yuhuan66666  
    OP
       2017-03-24 10:45:02 +08:00   1
    @mkstring #5 但是 好像我的工程运行一下 main 就结束了。。。程序就终结了
    reeco
        9
    reeco  
       2017-03-24 10:48:45 +08:00   1
    - 首先干掉你本地的 servlet 相关的依赖
    - 如果只是个 commmand line 应用,你可以使用继承 CommandLineRunner ,参考这里: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-simple/src/main/java/sample/simple/SampleSimpleApplication.java
    TakWolf
        10
    TakWolf  
       2017-03-24 10:52:05 +08:00
    楼主估计想要这个文档:
    http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-traditional-deployment

    1. JavaWeb 运行,只要是 sevlert ,就无法脱离容器。
    2. Spring boot 运行可以不用内置 tomcat ,而是打包成 war ,部署到独立容器中。参考上面文档。
    yuhuan66666
        11
    yuhuan66666  
    OP
       2017-03-24 11:59:25 +08:00 via Android
    @TakWolf 其实不是呀,我是想完全脱离 tomcat 。就是个 Java 本地工程
    ooTwToo
        12
    ooTwToo  
       2017-03-24 12:08:32 +08:00 via iPhone
    那就不用 SpringBoot 啊,直接 Spring4 搭建一套啊。但你不用 Servlet 容器怎么跑?
    yuhuan66666
        13
    yuhuan66666  
    OP
       2017-03-24 12:13:49 +08:00 via Android
    @ooTwToo 想写成本地工程
    springmarker
        14
    springmarker  
       2017-03-24 12:17:24 +08:00 via Android
    那谁来解析 http 协议呢
    yuhuan66666
        15
    yuhuan66666  
    OP
       2017-03-24 12:18:03 +08:00 via Android
    @springmarker 我不需要连接网络呀,我就是本地跑
    ixiaozhi
        16
    ixiaozhi  
       2017-03-24 12:40:34 +08:00
    swing?
    springmarker
        17
    springmarker  
       2017-03-24 12:52:07 +08:00 via Android
    本地 application?为什么要用 springboot
    plprapper
        18
    plprapper  
       2017-03-24 12:57:27 +08:00
    有一个 http 的接口 也没啥不好的, 至少可以用来暴露 metric monitor 。
    yuhuan66666
        19
    yuhuan66666  
    OP
       2017-03-24 13:01:30 +08:00
    @springmarker #17 因为不知道应该拿啥写了。。。。。。

    只会写 web 了。。。
    yuhuan66666
        20
    yuhuan66666  
    OP
       2017-03-24 13:01:56 +08:00
    @plprapper #18 主要是没必要依赖 tomcat
    yuhuan66666
        21
    yuhuan66666  
    OP
       2017-03-24 13:18:34 +08:00
    @reeco #9 请问可以保持在后台运行么?
    MntCw
        22
    MntCw  
       2017-03-24 14:18:36 +08:00 via Android
    桌面 JAVA 应用?
    murmur
        23
    murmur  
       2017-03-24 14:20:29 +08:00
    可以考虑用 jetty
    scipio
        24
    scipio  
       2017-03-24 14:21:35 +08:00 via Android   1
    楼主是希望用 Java 写一个本地的常驻进程吗?
    fighter2011
        25
    fighter2011  
       2017-03-24 14:21:56 +08:00
    你可以看看 playframework
    dremy
        26
    dremy  
       2017-03-24 14:22:26 +08:00 via Android
    不使用 HTTP 协议的 Web 应用?
    难道自己用 TCP 协议来通信?
    yuhuan66666
        27
    yuhuan66666  
    OP
       2017-03-24 15:08:51 +08:00
    @dremy #26 不需要网络服务,就是个本地工程
    flowerwrong
        29
    flowerwrong  
       2017-03-24 15:52:51 +08:00
    那你用 java se 不就好了
    yuhuan66666
        30
    yuhuan66666  
    OP
       2017-03-24 16:54:31 +08:00
    @scipio #24 是 就是这个
    yuhuan66666
        31
    yuhuan66666  
    OP
       2017-03-24 17:06:28 +08:00
    @flowerwrong #29 但是用到 redis solr mq 什么的 spring 不是更加方便么
    lululau
        32
    lululau  
       2017-03-24 18:04:52 +08:00
    springboot 和 tomcat 有啥关系。。。
    lululau
        33
    lululau  
       2017-03-24 18:05:12 +08:00
    springboot 和 web 也没关系啊
    yuhuan66666
        34
    yuhuan66666  
    OP
       2017-03-24 18:18:40 +08:00
    @lululau #32 springboot 内置了 serlet 容器,默认是 tomcat
    misaka19000
        35
    misaka19000  
       2017-03-24 18:36:25 +08:00 via Android
    @yuhuan66666 点错成感谢了,你程序运行结束自然就退出了啊,没懂常驻是什么意思,要不来个死循环?
    v2orz
        36
    v2orz  
       2017-03-24 19:20:21 +08:00
    请查阅官方文档:
    71.5 Create a non-web application
    v2orz
        37
    v2orz  
       2017-03-24 19:22:32 +08:00
    详细点说, CommandLineRunner ,然后你需要自己去 hook 关闭、停止
    不然你觉得为什么 tomcat 可以一直运行,循环啊
    wc951
        39
    wc951  
       2017-03-24 20:27:50 +08:00
    看看 maven 依赖树就知道 springboot 只有引入了 web 的 starter 之后才会内置 tomcat ,非 web 项目可以在 new SpringApplication 的时候 setWebEnvironment(false)
    yuhuan66666
        40
    yuhuan66666  
    OP
       2017-03-24 21:04:56 +08:00
    @wc951 #39 是,但是如何做到没有容器情况下后台常驻呢
    wc951
        41
    wc951  
       2017-03-24 21:19:22 +08:00
    @yuhuan66666 Thread.currentThread().join()
    AccIdent
        42
    AccIdent  
       2017-03-24 21:54:28 +08:00
    nohup
    incompatible
        43
    incompatible  
       2017-03-24 21:55:50 +08:00
    用框架多了真的容易废掉。你的需求用纯 java se 就可以搞定啊。
    一个 public static void main(String[] args)方法,方法内部启动一个非 daemon 的 Thread ,在 Thread 里做循环不就行了?

    如果要用 spring 管理 bean 的话,直接 new ClasspathXmlApplicationContext("/classpath/to/your/bean/definition.xml"),想用哪个 bean 就从这个 ApplicationContext 里用 getBean()取就行了。
    phx13ye
        44
    phx13ye  
       2017-03-24 22:13:35 +08:00   1
    233333 一堆人的回复我看傻了,感觉楼主的需求有一个 ExecutorService ,别 shutdown 就行
    21grams
        45
    21grams  
       2017-03-24 22:39:21 +08:00
    难道不是 jdk 就足够了吗? 非 web 用什么 springboot ,能给你什么好处?
    xuhaoyangx
        46
    xuhaoyangx  
       2017-03-24 22:39:35 +08:00
    @incompatible #43 我也是这么觉得-。-
    macroideal
        47
    macroideal  
       2017-03-25 06:24:29 +08:00 via iPhone
    springboot 不就是为了这个目的诞生的么,
    你可'能用法不对
    hyrijk
        48
    hyrijk  
       2017-03-25 09:38:57 +08:00
    后台运行

    nohup java -jar jar 包 &
    sorra
        49
    sorra  
       2017-03-25 09:59:53 +08:00
    @phx13ye +1 ,开一个线程池(1~n 个线程都可以), ExecutorService.awaitTermination 或瞌睡轮询 isTerminated 。线程池里跑永久任务。
    jack80342
        50
    jack80342  
       2017-10-11 22:56:46 +08:00
    最近翻译了 Spring Boot 的最新文档,欢迎 Fork。
    https://www.gitbook.com/book/jack80342/spring-boot/details
    zhiguang
        51
    zhiguang  
       2018-07-17 11:32:19 +08:00
    呵呵,那些说用框架就废了的,springboot 难道不是可以根据注解自动配置吗,楼主应该就是想要这种功能
    qbmiller
        52
    qbmiller  
       2019-02-23 15:34:22 +08:00
    题外话: 在游戏行业几年,出来面试互联网, 每次一提到 spring 就头疼, 好多程序员的确是离开 spring 不会写代码了...
    但现在自己看完 spring 源码后,还是感觉挺好的. 看个人需求吧.
    zhangfeiwudi
        53
    zhangfeiwudi  
       2019-06-05 11:25:00 +08:00
    SpringApplication application = new SpringApplication(Springboot1Application.class);
    //关闭 web 默认启动
    application.setWebApplicationType(WebApplicationType.NONE);
    application.run();
    go_starter
        54
    go_starter  
       2019-06-11 20:35:51 +08:00
    很简单啊,去除 web 相关依赖或者设置 WebApplicationType.None。代码里面用死循环,打包 jar 运行可以常驻后台。任务比较多的话建议使用线程池。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2581 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 04:53 PVG 12:53 LAX 21:53 JFK 00:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86