关于不重启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文件权限码
权限 二进制值 八进制值 描述 --- 000 0 没有任何权限 --x 001 1 只有执行权限 -w- 010 2 只有写入权限 -wx 011 3 有写入和执行权限 r-- 100 4 只有读取 ...
- 【UVA - 1644 / POJ - 3518】Prime Gap(水题)
Prime Gap 这里直接写中文了 Descriptions: 对于一个数n,若n为素数则输出0,否则找到距离n最小的两个素数,一个大于n,一个小于n,输出他们的差(正数) Input 多组输入 每 ...
- Linux基础命令---间歇执行命令---watch
[watch] watch指令可以间歇性的执行程序,将输出结果以全屏的方式显示,默认是2s执行一次. watch指令下发后,将会一直被执行,直到被中断. [语法] watch \ [-d h v t] ...
- [c++] 链表各类操作详解
链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称 ...
- 【Python】【demo实验3】【显示素数,显示两个数范围内的所有素数】
打印两个整数之间的所有素数: (使用平方根来判断 是否应停止验证该数值是否为素数) for i in range(956253526252,9956253526252): k = 1 if i == ...
- python装饰器的原理
装饰器的原理就是利用<闭包函数>来实现,闭包函数的原理就是包含内层函数的return和外层环境变量:
- C++多线程基础学习笔记(八)
shared_futrue和futrue_status的用法 shared_futrue是一个类模板,类似于futrue,不同的是它的成员函数get()可以使用多次,因为是复制数据,而futrue的g ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- 01:keepalive高可用集群
1.1 keepalived高可用软件介绍 1.keepalived--监控检查 注:keepalive软件有两种功能:监控检查.VRRP冗余协议 1. keepalive的作用是检测web服务器的状 ...
- cookie,session,token的理解
Get POST 区别异同点 淘宝token的 理解 过程算法 防止伪造请求 伪造相对难 简单发展史 登录的操作: 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个 ...