关于不重启Tomcat自动加载改变的class文件
修改server.xml,在Host标签下加入以下配置
<Context path="" docBase="FileManager" reloadable="true">
</Context>
<Context path="/FileManager" docBase="FileManager" reloadable="true">
</Context>
第一个Context是为了ip+端口直接指向FileManger这个项目。
path代表的是URL入口,例如第一个代表localhost:8080,第二个则代表localhost:8080/FileManger。
docBase是物理路径,可以是绝对路径,也可以是相对Host标签中appBase的相对路径,而Host标签中appBase的默认值是webapps文件夹,所以这里的FileManger就代表webapps下的FileManager文件夹。
这里的path+docBase的配置就表示了ip+端口或者ip+端口+/项目名称都可以指向你的项目。
reloadable就告诉Tomcat需要监控WEB-INF中的class文件,如果有变化了,就需要重新加载。并且是重新加载整个项目的,包括web.xml等等。
但是这样修改是不会监控web.xml变化的,web.xml变了之后并不会重新加载项目。而且直接在server.xml里配置,server.xml变化了Tomcat是不会重新加载的,必须重新启动Tomcat才会更新server.xml中的内容。
加入WatchedResource标签,首先我尝试了直接在server.xml直接加入:
<Context path="" docBase="FileManager" reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/FileManager" docBase="FileManager" reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
但是这样并没有效果,web.xml变了后,Tomcat并没有reload,原因暂时不知道。
在项目的META-INF中加入context.xml:
<?xml version='1.0' encoding='utf-8'?>
<Context reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>
此时,server.xml的配置如下:
<Context path="" docBase="FileManager" reloadable="true">
</Context>
因为如果在server.xml里配置了Context,就不会加载项目中的META-INF中的context.xml
我在这里的想法是通过server.xml里这样配置,指定ip+端口可以直接指向我的那个项目,然后再在项目的META-INF中配置context.xml实现监控web.xml。
事实证明,ip+端口或者ip+端口+项目名都可以自动加载改变的class文件了,并且也会在web.xml变化的时候重新加载,但是修改web.xml指挥改变ip+端口+项目名的,而不会变化ip+端口,例如,我将welcom-file改成Home1.jsp,这时前者会报404错误(因为我的项目中并没有Home1.jsp,这证明了它的web.xml确实改变了,但是后者却依然可以正常访问,并且是指向了原先的Home.jsp)。
分析下原因,在第二部分提到了再server.xml里直接加WatchedResource无效,所以其实按照第三部分的设置,ip+端口只是指向了FileManger那个文件夹,并没有监控web.xml的变化。(原因依然未知,为啥在那里设置WatchedResource无效?)
经过前三部分的试验,再结合ip+端口默认加载的是webapps下ROOT文件夹下的项目,应该可以想到了一个解决方案了。
将FileManger文件夹下的项目拷贝到ROOT文件夹下,server.xml配置文件不用加额外配置,在两个文件夹下中的META-INF中都加入内容如第三部分的context.xml文件,这样就可以都监控到class文件变化,也可以监控web.xml变化了。但是这样的话软件更新就必须要改两处地方,更好的解决方案也没有想到,因为对Tomcat的配置也不是特别清楚。
注意
这样不重启Tomcat自动加载class文件,有时候控制台会报错,内容如下:
Illegal access: this web application instance has been stopped already. Could not load ********. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
这个是因为Tomcat在重新加载class的时候是重新装载整个web项目的,并没有关闭所有线程,在Tomcat关闭后,那些线程依然运行,这样就会导致这些错误。
我用了DBCP来管理连接,每次都是那块报这个错误,但是好像并没有影响软件的使用,等那些没有关闭的线程都关闭后,就不会继续报错了。如果不想报错的话,只能重启Tomcat,把reloadable设置成false。
关于不重启Tomcat自动加载改变的class文件的更多相关文章
- 修改类不重启tomcat 自动加载项目
可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomc ...
- 转:修改类不重启tomcat 自动加载项目
可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) (rel ...
- tomcat自动加载class
转载 tomcat自动加载改变的class文件(无需重启tomcat) http://blog.csdn.net/miraclestar/article/details/6434164 不重启Tom ...
- Tomcat 7 自动加载类及检测文件变动原理
在一般的 web 应用开发里通常会使用开发工具(如 Eclipse.IntelJ )集成 tomcat ,这样可以将 web 工程项目直接发布到 tomcat 中,然后一键启动.经常遇到的一种情况是直 ...
- Tomcat7 自动加载类及检测文件变动原理
在一般的web应用开发里通常会使用开发工具(如Eclipse.IntelJ)集成tomcat,这样可以将web工程项目直接发布到tomcat中,然后一键启动.经常遇到的一种情况是直接修改一个类的源文件 ...
- 关于Tomcat自动加载更新class的小技巧
在Tomcat的server.xml或者Tomcat.xxx\conf\Catalina\localhost\project.xml文件中里Context标签内:<!-- reloadable为 ...
- 启动Tomcat自动加载(运行)类
其实这是紧跟着我上次写的java计时器Timer的,因为Timer的测试类写好后,不可能要通过什么东西去触发,对已经存在的时间点进行监控 所以,在启动项目是自动运行此类 方法如下: 一.在web.xm ...
- Intellij Idea自动加载改动文件和自动自动热部署加载
1:准备原料 我的Intellij Idea的版本是15. 之后tomcat自动加载修,你只需要在浏览器刷新一下页面即可. ************************************** ...
- Yaf零基础学习总结5-Yaf类的自动加载
Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...
随机推荐
- linux系统查看当前正在运行的服务
--查看当前服务器所有服务 service --status-all -- 查看当前所有正在运行的服务 service --status-all | grep running --查看指定服务运行状态 ...
- 学习ansible笔记1
ansible的特点: -- 模块化设计 -- 仅需要ssh和Python即可以使用 -- 无客户端 -- 功能强大,模块丰富 -- 上手容易门槛低 -- 基于python开发,做二次开发更容易 -- ...
- Autofac依赖注入容器
依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ...
- 纯css实现单选框样式
html代码 <h2>你最喜欢的水果</h2> <div class="input-radio"> <!-- 选中状态添加 checked ...
- PDF技术(四)-Java实现Html转PDF文件
html转换为pdf的关键技术是如何处理网页中复杂的css样式.以及中文乱码处理. 各实现对比表于Windows平台进行测试: 基于IText 基于FlyingSaucer 基于WKHtmlToPdf ...
- WijmoJS 以声明方式添加 Vue 菜单项
WijmoJS 以声明方式添加 Vue 菜单项 在V2019.0 Update2 的全新版本中,Vue框架下 WijmoJS 的前端UI组件功能得到再度增强. 如今,向wj菜单组件添加项的方法将不限于 ...
- Docker守护进程
Docker安装完成之后, 需要确定Docker的守护进程是否已经运行. Docker是使用root 权限运行他的程序,进而可以处理普通用户无法完成的操作(比如挂载文件系统). docker程序是Do ...
- Mac 安装 Homebrew
为什么要在 MAC 上安装 Homebrew 它干什么用的呢?我们知道在 CentOS 和 Ubuntu 上都有自己的包管理工具,但是在 MAC 上却没有这样类似的管理工具. # CentOS $ y ...
- centos 7 源码安装 mysql 5.6
下载 mysql 安装包 $ wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.44.tar.gz # or $ curl -O ht ...
- Java并发理论简介
这些文字来自于Java程序员修炼之道,记录一下 一. java线程模型 Java线程模型建立在两个基本概念之上 共享的,默认可见的可变状态 抢占式线程调度 我们从侧面思考一下这两个概念 所有线程可以很 ...