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

2020-03-12 10:03:02 +08:00
 tctc4869

之前开发了一个传统的带 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 配置,我怕改动较大,运行不了。

大家有哪些好方法么?

5004 次点击
所在节点    Java
40 条回复
hantsy
2020-03-12 13:14:07 +08:00
直接与 Servlet 容器一起进 Docker Images
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
2020-03-12 13:43:26 +08:00
@guixiexiezou tomcat-embed-core 这个?还是某些人用这个封装的一个 tomcat.jar?
6IbA2bj5ip3tK49j
2020-03-12 13:46:07 +08:00
连 maven/gradle 这种依赖管理工具都不想用。就别整什么微服务了。
tctc4869
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
2020-03-12 14:13:44 +08:00
只有前后端分离的 web 项目的服务端才能加入微服务体系。如果是传统的 JavaWeb 项目,需要先进行前后端分离的改造。
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
2020-03-12 14:45:40 +08:00
maven 依赖网络又咋样呢 反正发布后就是个 jar 不会依赖 maven 了
MOETAN0
2020-03-12 15:03:29 +08:00
@johnj
@xgfan
我理解楼主的意思并不是反对 maven,对企业来说,有些存量的大型应用如果做 maven 化改造,就要把以前一堆第三方依赖都整理清楚(而且还真不一定能整理出来,我见过无数不在仓库的 jar ),企业会觉得短期收益不高就保持现状呗。
reus
2020-03-12 15:05:27 +08:00
微服务不是你说的这个意思…………
longbo666
2020-03-12 15:33:25 +08:00
我一个前端看得津津有味,后端的世界很有趣呀
tctc4869
2020-03-12 15:38:05 +08:00
@MOETAN0 我觉得,我还是想要来一个经过内嵌 tomcat 改造的 Dynamic Web Project 演示项目(假设是正在开发过得,所以带 web.xml )这样比较好弄清楚(不是我英语的问题),在对比演示项目和我的项目,并进行修改。演示项目导入即可运行的话,我会给点幸苦费把。
Aresxue
2020-03-12 16:54:42 +08:00
不想转 maven。。。2020 年了朋友,依赖管理都不用你这个项目是不打算长期活下去?
谈谈思路,仿照 maven 进行 java 文件结构的管理,把 tomcat(或其它容器)的 jar 包加到你项目的依赖里,然后自己写个启动类,里面的内容就是仿照 Spring boot 先启动 tomcat 容器,把你的源码编译成 class 放到指定的目录,再从指定目录读取这些字节码装载到 JVM 的类加载器里面去(tomcat 有独立的类加载器架构, 违反了双亲委派原则), 一些需要监听和注册服务也注册和监听到 Spring 和 tomcat 里面去
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
2020-03-12 17:00:10 +08:00
@tctc4869
当然,必须严肃地指出:你这种方式,并不是微服务(甚至八竿子打不到)。
rockyou12
2020-03-12 17:00:34 +08:00
lz 这种别搞 fatjar 了,结构太老很复杂的,光是依赖你就理不清楚。docker 比较省事
tctc4869
2020-03-12 17:29:36 +08:00
@MOETAN0 我词用错了,我知道其实微服务应该不仅仅是指 fatjar 或 spring boot,或.net core
tctc4869
2020-03-12 17:35:38 +08:00
@rockyou12 docker 的话,看上面评论都有推荐 docker 的,找个机会学习一下,

不过我查了一下资料,我的项目的线上环境是 windows server 2012,我记得 docker 的 windows 环境,必须是 windows server 2016 或 win10……
tctc4869
2020-03-12 18:04:18 +08:00
@MOETAN0
我不能确定你这个项目是用什么开发的,我的开发软件是 eclipse。导入不行,也把 main 函数的代码复制过来,运行,修改 webapp 名称,运行,还是有 No global web.xml found 这个提示,然后报错,这可能也是开发软件的配置缘故,也许如 @rockyou12 所说,这种老项目牵扯很多,不建议搞 fatjar,那我还放弃了吧,不过还是谢谢你。
MOETAN0
2020-03-12 18:15:56 +08:00
@tctc4869
ideaC
Eclipse 也一样的,No global web.xml found 正常。看下 servlet 的 init 中的输出日志里是否有打印,以及浏览器访问看是否 ok。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652076

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX