V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yuhuan66666
V2EX  ›  问与答

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

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

    想写个本地工程,用 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   ·   实用小工具   ·   4613 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:37 · PVG 13:37 · LAX 21:37 · JFK 00:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.