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

传统那种必须带 Web.xml 的 Java web 项目,如何脱离依赖单独服务端软件,以微服务化得方式运行部署?

  •  
  •   tctc4869 · 2020-03-12 10:03:02 +08:00 · 4763 次点击
    这是一个创建于 1499 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前开发了一个传统的带 web.xml 的 SSM 项目,现在成型了不少,但依赖 tomcat 软件,我想让其微服务化运行,如何像 spring boot 一样,内嵌 tomcat 或者 Undertow。通过 main 函数启动,或是类似打成 jar 包部署,在 windows 上 用 bat 命令。java -jar xxx.jar 这种方式运行

    网上多数内嵌服务端容器的教程,都是带 maven,要么 spring boot,但我这个成型的项目是非 maven,我也不想转,有人提议转成 spring boot,我不想转成 spring boot,有几个 spring xml 配置,我怕改动较大,运行不了。

    大家有哪些好方法么?

    第 1 条附言  ·  2020-03-12 15:39:19 +08:00
    标题的“微服务”该词用错,导致有些人有点误解,抱歉啊,应该是“打成 jar 包”
    40 条回复    2020-03-12 18:15:56 +08:00
    chendy
        1
    chendy  
       2020-03-12 10:10:27 +08:00
    除非骚操作太多,否则上 maven 不是什么大问题,上 spring-boot 也没有什么大问题
    sagaxu
        2
    sagaxu  
       2020-03-12 10:16:47 +08:00 via Android
    是 springboot 不能 import xml 配置?还是找不到非 spring 程序内嵌 tomcat 的办法?
    tctc4869
        3
    tctc4869  
    OP
       2020-03-12 10:22:45 +08:00
    @sagaxu 准确的说,是我找不到非 Spring boot 的非 maven 的 java web 项目的内嵌 tomcat 的方法,
    该项目目前都必须带 web.xml 文件才能启动,而且我并不想转成 maven 项目。
    tctc4869
        4
    tctc4869  
    OP
       2020-03-12 10:25:44 +08:00
    @chendy 我不想转成 maven
    hcymk2
        5
    hcymk2  
       2020-03-12 10:32:17 +08:00
    微服务和是否内嵌 tomcat 或者 Undertow 没有关系。
    sonyxperia
        6
    sonyxperia  
       2020-03-12 10:37:11 +08:00
    maven 做错了什么
    liuxey
        7
    liuxey  
       2020-03-12 10:42:55 +08:00
    那就不要转微服务化了, 传统的 tomcat 跑跑也挺好的,
    一个 tomcat 跑一个服务,不也是“微服务”了吗,

    PS:tomcat 也是通过 main 函数启动的,也是打包成各种 jar 包部署,startup.bat 也是 java - 命令启动的,何必为难自己
    tctc4869
        8
    tctc4869  
    OP
       2020-03-12 10:58:30 +08:00
    @hcymk2 好把,用词不对
    zhaorunze
        9
    zhaorunze  
       2020-03-12 11:01:43 +08:00
    spring boot 也可以读取 spring xml 配置 吧?只有你想不到的,没有别人没有实现的
    tctc4869
        10
    tctc4869  
    OP
       2020-03-12 11:02:33 +08:00
    @sonyxperia maven 对于我来说,最大的问题是依赖网络,这就让我心里不踏实。即便 maven 配置里的引用 url 换上阿里云的也是一样
    tctc4869
        11
    tctc4869  
    OP
       2020-03-12 11:04:21 +08:00
    @liuxey 主要是不知道怎么让传统的那种 web.xml java web 项目,通过 tomcat-embed-core 启动,如果是 maven 的,那我知道是怎么启动的。
    MOETAN0
        12
    MOETAN0  
       2020-03-12 11:04:39 +08:00
    tomcat 有 embed 模式,可以通过 API 方式启动(不用 maven ),并加载你原有的 web.xml 。
    可以参见 https://www.codejava.net/servers/tomcat/how-to-embed-tomcat-server-into-java-web-applications
    「 3. The Tomcat Embed API 」
    --------
    To configure the server for an existing web application, use the following Tomcat’s method:
    addWebapp(String contextPath, String baseDir)
    Where contextPath is the web application name and baseDir is the base directory of the application. baseDir can refer to an external WAR file, or to a web application directory in the same project.
    Cbdy
        13
    Cbdy  
       2020-03-12 11:14:58 +08:00
    Docker
    ElegantOfKing
        14
    ElegantOfKing  
       2020-03-12 11:27:41 +08:00
    @tctc4869 如果担心网络的话,可以自己在本地 使用 Nexus 搭建 Maven 私服。
    guixiexiezou
        15
    guixiexiezou  
       2020-03-12 11:31:31 +08:00
    如果不想外部使用 tomcat 的话,那就内嵌一个 tomcat 就可以了,有一个 tomcat.jar 的类库可以使用
    Hyseen
        16
    Hyseen  
       2020-03-12 11:44:37 +08:00
    那就用 Docker 吧
    suspended
        17
    suspended  
       2020-03-12 12:22:54 +08:00
    328KB 的 Winstone.jar 如何?
    fatpower
        18
    fatpower  
       2020-03-12 13:00:44 +08:00
    docker + tomcat
    fmumu
        19
    fmumu  
       2020-03-12 13:10:57 +08:00 via Android
    用 jetty 就可以啊
    maven
        20
    maven  
       2020-03-12 13:13:40 +08:00
    你用 docker 就是了啊,但问题是你这样只是虚拟化,并不是微服务啊。
    hantsy
        21
    hantsy  
       2020-03-12 13:14:07 +08:00
    直接与 Servlet 容器一起进 Docker Images
    hantsy
        22
    hantsy  
       2020-03-12 13:20:33 +08:00
    Spring Boot 2.3 官方 Spring Boot Maven/Gradle Plugin 也开始支持 Docker Image。

    之前版本的 Spring Boot,生成一个超大的 Jar 文件,实际不大适合 Docker 发布。Spring Team 有一个维护一个 Thin 版本的 Boot Plugin,将依赖和应用的 Jar 分开,这样在 Build Docker Image 的时候,大部分时间只需要上传你的 jar 产生的 Layer,而依赖的 Layers 常常不变(只要你的依赖不产生变化),从时间和网络,云服务数据产生的费用上考虑是比较合理的。
    tctc4869
        23
    tctc4869  
    OP
       2020-03-12 13:43:26 +08:00
    @guixiexiezou tomcat-embed-core 这个?还是某些人用这个封装的一个 tomcat.jar?
    xgfan
        24
    xgfan  
       2020-03-12 13:46:07 +08:00
    连 maven/gradle 这种依赖管理工具都不想用。就别整什么微服务了。
    tctc4869
        25
    tctc4869  
    OP
       2020-03-12 14:00:20 +08:00
    @MOETAN0
    你好,谢谢你的回复,你这个我看了一下,我直接 6.Embedding Tomcat server for an Existing Java Web Application 标题的下面的代码,我直接复制到我的项目,并改成我开发的传统带 web.xml 项目中。运行之后,出现一个警告
    No global web.xml found,找不到 web.xml 文件

    之后出现一个错误提示,A child container failed during start。你知道这是什么原因么?
    xuanbg
        26
    xuanbg  
       2020-03-12 14:13:44 +08:00
    只有前后端分离的 web 项目的服务端才能加入微服务体系。如果是传统的 JavaWeb 项目,需要先进行前后端分离的改造。
    MOETAN0
        27
    MOETAN0  
       2020-03-12 14:31:32 +08:00
    @tctc4869
    addWebapp 的第二个参数 baseDir 一般是对应传统的 WebContent 目录,那么 web.xml 的位置应该在 baseDir\WEB-INF\web.xml

    更多例子:
    https://www.programcreek.com/java-api-examples/?class=org.apache.catalina.startup.Tomcat&method=addWebapp

    同时,还要注意项目原有在 baseDir\WEB-INF\lib 下的依赖,可能需要调整到 main 工程的依赖(因为项目从 Dynamic Web Project 变成了 Java Project )
    johnj
        28
    johnj  
       2020-03-12 14:45:40 +08:00
    maven 依赖网络又咋样呢 反正发布后就是个 jar 不会依赖 maven 了
    MOETAN0
        29
    MOETAN0  
       2020-03-12 15:03:29 +08:00
    @johnj
    @xgfan
    我理解楼主的意思并不是反对 maven,对企业来说,有些存量的大型应用如果做 maven 化改造,就要把以前一堆第三方依赖都整理清楚(而且还真不一定能整理出来,我见过无数不在仓库的 jar ),企业会觉得短期收益不高就保持现状呗。
    reus
        30
    reus  
       2020-03-12 15:05:27 +08:00
    微服务不是你说的这个意思…………
    longbo666
        31
    longbo666  
       2020-03-12 15:33:25 +08:00
    我一个前端看得津津有味,后端的世界很有趣呀
    tctc4869
        32
    tctc4869  
    OP
       2020-03-12 15:38:05 +08:00
    @MOETAN0 我觉得,我还是想要来一个经过内嵌 tomcat 改造的 Dynamic Web Project 演示项目(假设是正在开发过得,所以带 web.xml )这样比较好弄清楚(不是我英语的问题),在对比演示项目和我的项目,并进行修改。演示项目导入即可运行的话,我会给点幸苦费把。
    Aresxue
        33
    Aresxue  
       2020-03-12 16:54:42 +08:00
    不想转 maven。。。2020 年了朋友,依赖管理都不用你这个项目是不打算长期活下去?
    谈谈思路,仿照 maven 进行 java 文件结构的管理,把 tomcat(或其它容器)的 jar 包加到你项目的依赖里,然后自己写个启动类,里面的内容就是仿照 Spring boot 先启动 tomcat 容器,把你的源码编译成 class 放到指定的目录,再从指定目录读取这些字节码装载到 JVM 的类加载器里面去(tomcat 有独立的类加载器架构, 违反了双亲委派原则), 一些需要监听和注册服务也注册和监听到 Spring 和 tomcat 里面去
    MOETAN0
        34
    MOETAN0  
       2020-03-12 16:57:56 +08:00
    @tctc4869
    https://c-t.work/s/387d6c1ca0004a
    jb2yea
    顺手写个一个 demo,带 web.xml 、servlet*1、jsp*1,因为很随意,所以不建议拿去用于工程实践,只是表达 Tomcat 嵌入使用时的简单目录结构以及如何启动。

    随意随意
    MOETAN0
        35
    MOETAN0  
       2020-03-12 17:00:10 +08:00
    @tctc4869
    当然,必须严肃地指出:你这种方式,并不是微服务(甚至八竿子打不到)。
    rockyou12
        36
    rockyou12  
       2020-03-12 17:00:34 +08:00
    lz 这种别搞 fatjar 了,结构太老很复杂的,光是依赖你就理不清楚。docker 比较省事
    tctc4869
        37
    tctc4869  
    OP
       2020-03-12 17:29:36 +08:00
    @MOETAN0 我词用错了,我知道其实微服务应该不仅仅是指 fatjar 或 spring boot,或.net core
    tctc4869
        38
    tctc4869  
    OP
       2020-03-12 17:35:38 +08:00
    @rockyou12 docker 的话,看上面评论都有推荐 docker 的,找个机会学习一下,

    不过我查了一下资料,我的项目的线上环境是 windows server 2012,我记得 docker 的 windows 环境,必须是 windows server 2016 或 win10……
    tctc4869
        39
    tctc4869  
    OP
       2020-03-12 18:04:18 +08:00
    @MOETAN0
    我不能确定你这个项目是用什么开发的,我的开发软件是 eclipse。导入不行,也把 main 函数的代码复制过来,运行,修改 webapp 名称,运行,还是有 No global web.xml found 这个提示,然后报错,这可能也是开发软件的配置缘故,也许如 @rockyou12 所说,这种老项目牵扯很多,不建议搞 fatjar,那我还放弃了吧,不过还是谢谢你。
    MOETAN0
        40
    MOETAN0  
       2020-03-12 18:15:56 +08:00
    @tctc4869
    ideaC
    Eclipse 也一样的,No global web.xml found 正常。看下 servlet 的 init 中的输出日志里是否有打印,以及浏览器访问看是否 ok。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2853 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:26 · PVG 19:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.