如何将远程部署应用到Tomcat上,针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的小伙伴找到更简单更容易的方法。
前几天有人在:群里问了一个问题。
如何通过程序将应用部署到Tomcat中?
工作比较忙,没有问具体的使用场景,提供了使用JMX接口的思路。后来提问者说不太了解JMX,就在网上搜了一些看了一下,比较混乱。
这次我不打算详细描述JMX是如何使用的,而是整理了Tomcat远程部署应用的几种方式,方便有类似需求的朋友。
说起应用部署,熟悉Tomcat的人都知道,它默认包含一个manager应用,有很多功能,包括应用部署,无论是目录部署还是文件部署。
开始写微信官方账号的时候,我介绍了一个小经理应用:深入Tomcat的经理。
这里请注意,manager应用程序的使用默认是受限的,只能在本地访问,所以如果想远程使用manager将应用程序部署到目标服务器,需要在content.xml中进行修改,可以参考前面的老文:为什么你的Manager登录不成功?
之后的配置和manager的本地使用一样,可以直接使用部署功能,不再赘述。让我们以接口的形式来讨论远程部署。
在管理器应用中,我们在页面上看到的一般称为HTML界面,还有一个文本界面,可以根据URL中指定的命令和参数执行相应的动作。
格式如下所示:
http://{主机} : {端口}/管理器/文本/{命令}?{参数}
而主机和端口到你的目标主机和端口,命令代表你执行的操作,而参数是命令需要的参数。
支持的命令很多,下图是managerServlet中部分代码的截图。
当然,没有我们想说的拦截deploy's的命令。我们将单独讨论这个订单。对应于我们前面提到的应用程序,url类似于:
http://localhost :8080/经理/文字/deploy?path=/你好war=d :/ABC . war
在这里,指定应用程序在磁盘上的存储路径和应用程序名称,就可以部署应用程序了。
部署结果如下所示:
确定-在上下文路径/你好部署应用程序
这里也支持应用程序的多版本部署,只需在参数中添加version即可。
让我们看看源代码,看看这个部署表单是如何实现的。
让我们看看红色方框标记的三个地方,这是整个部署逻辑的重点。
首先,将应用程序添加到服务中,以表示注册的服务。将首先检查以后的部署,不在此列表中的部署将被允许。
将远程应用程序包复制到本地目录。
触发部署逻辑,实际部署。
需要注意的是,第一步和第三步实际上是通过JMX接口进行的。例如,检查方法的内容如下:
这里的MBean服务器是注册JMX所有MBean对象的服务点。连接到MBeanServer后,其背后的逻辑和反射有些相似。只需指定对象名,然后指定方法名和参数。
我们这里的ObjectName是catalina : host=locahost,type=deployer’。
打完支票后,
最终会调用到HostConfig类的check方法,从而触发部署流程,进行应用的部署。完整的部署过程请参考前面的文章:
如何在Tomcat中部署应用的多个版本
WEB应用是怎么被部署的?
Tomcat集群应用部署功能实现分析
所以,如果你想自己造个轮子来实现远程部署的时候,也可以参考这种使用JMX的方式。
另一种方式
之前介绍过IDE内Tomcat工作方式时描述过IDEA里在向Tomcat部署应用时是怎么样通过JMX进行的(你一定不知道IDE里的Tomcat是怎么工作的!)。
在IDEA里,向tomcat部署一个应用,启动时,其实并不会在本地的tomcat中找到该应用的目录,或者实际运行的目录下有该应用。仔细观察发现,IDEA是通过Tomcat的MBean,动态的向tomcat增加了一个Context,即一个应用。这样直接指定了应用的路径,访问路径等。
例如下面的调用链:
TCP Connection(2)-127.0.0.1@1379 daemon, prio=5, in group 'RMI Runtime', status: 'RUNNING'
at org.springframework.web.context.ContextLoaderListener.<init>(ContextLoaderListener.java:98)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1585)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:463)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
at java.lang.Thread.run(Thread.java:745)
也就是根据实际路径path,docBase这些构造一个StandardContext,并添加到Host中,对外提供服务。
以上,是几种通过JMX可以动态远程部署的方式,供参考。当然如果想用更直接一些的方式,在代码里控制应用的copy,然后控制Tomcat进程自动重启,也可以啦。
关于如何远程部署应用到Tomcat问题的解答就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/102828.html