之前开发了一个传统的带 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
chendy 2020-03-12 10:10:27 +08:00
除非骚操作太多,否则上 maven 不是什么大问题,上 spring-boot 也没有什么大问题
|
2
sagaxu 2020-03-12 10:16:47 +08:00 via Android
是 springboot 不能 import xml 配置?还是找不到非 spring 程序内嵌 tomcat 的办法?
|
3
tctc4869 OP @sagaxu 准确的说,是我找不到非 Spring boot 的非 maven 的 java web 项目的内嵌 tomcat 的方法,
该项目目前都必须带 web.xml 文件才能启动,而且我并不想转成 maven 项目。 |
5
hcymk2 2020-03-12 10:32:17 +08:00
微服务和是否内嵌 tomcat 或者 Undertow 没有关系。
|
6
sonyxperia 2020-03-12 10:37:11 +08:00
maven 做错了什么
|
7
liuxey 2020-03-12 10:42:55 +08:00
那就不要转微服务化了, 传统的 tomcat 跑跑也挺好的,
一个 tomcat 跑一个服务,不也是“微服务”了吗, PS:tomcat 也是通过 main 函数启动的,也是打包成各种 jar 包部署,startup.bat 也是 java - 命令启动的,何必为难自己 |
9
zhaorunze 2020-03-12 11:01:43 +08:00
spring boot 也可以读取 spring xml 配置 吧?只有你想不到的,没有别人没有实现的
|
10
tctc4869 OP @sonyxperia maven 对于我来说,最大的问题是依赖网络,这就让我心里不踏实。即便 maven 配置里的引用 url 换上阿里云的也是一样
|
11
tctc4869 OP @liuxey 主要是不知道怎么让传统的那种 web.xml java web 项目,通过 tomcat-embed-core 启动,如果是 maven 的,那我知道是怎么启动的。
|
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. |
13
Cbdy 2020-03-12 11:14:58 +08:00
Docker
|
14
ElegantOfKing 2020-03-12 11:27:41 +08:00
@tctc4869 如果担心网络的话,可以自己在本地 使用 Nexus 搭建 Maven 私服。
|
15
guixiexiezou 2020-03-12 11:31:31 +08:00
如果不想外部使用 tomcat 的话,那就内嵌一个 tomcat 就可以了,有一个 tomcat.jar 的类库可以使用
|
16
Hyseen 2020-03-12 11:44:37 +08:00
那就用 Docker 吧
|
17
suspended 2020-03-12 12:22:54 +08:00
328KB 的 Winstone.jar 如何?
|
18
fatpower 2020-03-12 13:00:44 +08:00
docker + tomcat
|
19
fmumu 2020-03-12 13:10:57 +08:00 via Android
用 jetty 就可以啊
|
20
maven 2020-03-12 13:13:40 +08:00
你用 docker 就是了啊,但问题是你这样只是虚拟化,并不是微服务啊。
|
21
hantsy 2020-03-12 13:14:07 +08:00
直接与 Servlet 容器一起进 Docker Images
|
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 常常不变(只要你的依赖不产生变化),从时间和网络,云服务数据产生的费用上考虑是比较合理的。 |
23
tctc4869 OP @guixiexiezou tomcat-embed-core 这个?还是某些人用这个封装的一个 tomcat.jar?
|
24
6IbA2bj5ip3tK49j 2020-03-12 13:46:07 +08:00
连 maven/gradle 这种依赖管理工具都不想用。就别整什么微服务了。
|
25
tctc4869 OP @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。你知道这是什么原因么? |
26
xuanbg 2020-03-12 14:13:44 +08:00
只有前后端分离的 web 项目的服务端才能加入微服务体系。如果是传统的 JavaWeb 项目,需要先进行前后端分离的改造。
|
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 ) |
28
johnj 2020-03-12 14:45:40 +08:00
maven 依赖网络又咋样呢 反正发布后就是个 jar 不会依赖 maven 了
|
29
MOETAN0 2020-03-12 15:03:29 +08:00
|
30
reus 2020-03-12 15:05:27 +08:00
微服务不是你说的这个意思…………
|
31
longbo666 2020-03-12 15:33:25 +08:00
我一个前端看得津津有味,后端的世界很有趣呀
|
32
tctc4869 OP @MOETAN0 我觉得,我还是想要来一个经过内嵌 tomcat 改造的 Dynamic Web Project 演示项目(假设是正在开发过得,所以带 web.xml )这样比较好弄清楚(不是我英语的问题),在对比演示项目和我的项目,并进行修改。演示项目导入即可运行的话,我会给点幸苦费把。
|
33
Aresxue 2020-03-12 16:54:42 +08:00
不想转 maven。。。2020 年了朋友,依赖管理都不用你这个项目是不打算长期活下去?
谈谈思路,仿照 maven 进行 java 文件结构的管理,把 tomcat(或其它容器)的 jar 包加到你项目的依赖里,然后自己写个启动类,里面的内容就是仿照 Spring boot 先启动 tomcat 容器,把你的源码编译成 class 放到指定的目录,再从指定目录读取这些字节码装载到 JVM 的类加载器里面去(tomcat 有独立的类加载器架构, 违反了双亲委派原则), 一些需要监听和注册服务也注册和监听到 Spring 和 tomcat 里面去 |
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 嵌入使用时的简单目录结构以及如何启动。 随意随意 |
36
rockyou12 2020-03-12 17:00:34 +08:00
lz 这种别搞 fatjar 了,结构太老很复杂的,光是依赖你就理不清楚。docker 比较省事
|
37
tctc4869 OP |
38
tctc4869 OP @rockyou12 docker 的话,看上面评论都有推荐 docker 的,找个机会学习一下,
不过我查了一下资料,我的项目的线上环境是 windows server 2012,我记得 docker 的 windows 环境,必须是 windows server 2016 或 win10…… |
39
tctc4869 OP |