Tomcat应用更新时,把新的WAR包放到webapps目录下,Tomcat就会自动把原来的同名webapp删除,并把WAR包解压,运行新的 webapp。
但是,有时候Tomcat并不能把旧的webapp完全删除,通常会留下WEB-INF/lib下的某个jar包,必须关闭Tomcat才能删除,这就导致自动部署失败。
解决方法是在<Context>元素中增加一个属性antiResourceLocking="true" antiJARLocking="true",默认是"false"。
这样就可以热部署了。
实际上,这两个参数就是配置Tomcat的资源锁定和Jar包锁定策略。
(1)antiJARLocking
先来看看应用的antiJARLocking属性设置为true时,Tomcat是怎么处理的。
针对antiJARLocking属性的处理集中在WebappClassLoader的getResource和findResourceInternal方法里,主要原理是将包含在Jar包里的资源抽取放到应用的工作目录(work里应用对应的目录)下去。
把这个属性设置为true之后,部署应用就可以在work\Catalina\localhost\struts2-blank\loader目录下看到被解压的Jar包内容。
antiJARLocking属性在有的时候并不会生效,从WebappClassLoader的getResource和findResource方法逻辑里可以看出一些端倪,在一些情况下(通过对Loader的delegate、searchExternalFirst等相关属性进行配置),资源的获取并不是WebappClassLoader去做的,而是其父加载器的getResource方法或父类的findResource方法去做的,WebappClassLoader的父类是URLClassLoader、父加载器是URLClassLoader实例。
(2)antiResourceLocking
当antiResourceLocking设置为true的时候,Tomcat不会锁定应用下的任何文件。那Tomcat是怎么做到这一点的呢?
在Tomcat的架构里,应用也是一个级别的容器,对应的接口是Context;各级容器本身都具备生命周期,而且配置了多个生命周期监听器来监听容器不同的生命周期过程。Tomcat在初始化的时候,给Context增加了一个生命周期监听器org.apache.catalina.startup.ContextConfig;然后在Context真正开始启动之前,会有一个BEFORE_START_EVENT状态,ContextConfig监听到这个状态的事件后,就会针对antiResourceLocking进行处理。
总结一下,就是如果应用的antiResourceLocking属性设置为true,就将应用的doc base移到临时目录下,让Tomca不会占用webapps下的文件。Tomcat里java.io.tmpdir默认指向Tomcat的temp目录。
副作用
从上面的分析来看,antiResourceLocking为true有几个副作用:
1) 会延长应用的启动时间,因为多了临时目录的清理和往临时目录拷贝应用内容的操作;a
2) 如果不知道这个属性的原理,修改webapps下应用的JSP,那就不会动态重加载到新的页面内容了,因为应用的doc base已经不再在webapps下了;
3) 停止Tomcat的时候,临时目录下实际的doc base会被删掉,
结合第二条和第三条,如果要修改应用的JSP,那必须将改动同时拷贝到两个目录下(原始doc base和临时目录下的doc base)。
所以Tomcat里这个属性缺省为false。在使用Tomcat 6.0.24之前的版本时,如果要用这个属性解决文件被锁的问题,三思而行。
相关推荐
总结以上内容,可以看出antiResourceLocking和antiJARLocking在Tomcat中主要用于解决文件锁定问题,以支持更为灵活的Web应用部署和更新。但是,这些配置选择需要根据实际应用场景谨慎使用,因为它们可能会带来一些副...
Tomcat 5.5 数据库连接池配置.doc tomcat 6.0.20在一个机器上安装多个服务的方法.doc tomcat 几种连接池配置代码.doc tomcat antiResourceLocking antiJARLocking 的作用和用法.doc Tomcat安全配置 .doc
3.要想管理模块能够顺利运行,那么还要保证一点:确保设置了CATALINA_HOME这个系统环境变量,变量...antiResourceLocking="false" antiJARLocking="false">一行里的${catalina.home}改成你的tomcat的安装路径就可以了。
### Tomcat Context关键属性说明 #### 一、引言 在Tomcat服务器中,`Context`元素用于配置一个Web应用程序的上下文环境。对于开发者来说,掌握这些配置属性至关重要,因为它们直接影响着Web应用的运行效率和安全性...
tomcat6 admin 管理页面 本tomcat是用apache-tomcat-6.0.26-windows-x86.zip和...如果不添加也不影响使用,只是打开tomcat时没有admin的链接,也可以直接在IE地址栏中输入http://localhost:8080/admin/ 打开管理页面.
${catalina.home}/webapps/admin" privileged="true" antiResourceLocking="false" antiJARLocking="false"> ``` 这里的 `${catalina.home}` 是 Tomcat 的安装根目录。 ##### 3. 添加依赖库 根据实际情况,可能...
<Context docBase="D:\myprj\WebRoot" privileged="true" antiResourceLocking="false" antiJARLocking="false"> <!-- Link to the user database we will get roles from --> <!-- 定义JNDI数据源 ...
可以通过修改`server.xml`中的`<Context>`标签,添加`antiResourceLocking="true"`和`antiJARLocking="true"`属性来优化。 4. **使用WebAppClassLoader**:针对特定应用的JAR,应放在Web应用的`WEB-INF/lib`下,由...
antiResourceLocking="false" antiJARLocking="false"> ``` 静态部署 静态部署是指在 Tomcat 运行之前就把相关的 Web 应用程序放置到合适的目录,在 Tomcat 启动的时候自动来部署这些应用程序。如果 ...
7. **安全设置**:更新`conf\server.xml`中的`<Context>`,启用安全配置,如`antiResourceLocking`和`antiJARLocking`,防止文件锁定问题。 通过上述步骤,你不仅能够成功安装Tomcat8.0.32和JDK1.8,还能对它们进行...
antiResourceLocking="false" antiJARLocking="false"> ``` 确保 `docBase` 的值指向 `apache-tomcat-5.5.27\server\webapps\admin`。 同时,也需要确保 `apache-tomcat-6.0.18\conf\Catalina\localhost` 目录下...
在Tomcat服务器的默认安装结构中,`webapps`目录是专门用来存放Web应用项目的。当我们将自己的项目文件(通常是`.war`文件或整个项目文件夹)直接放置在这个目录下时,Tomcat会自动将这些应用部署起来。这种方式非常...
<Context docBase="D:\myprj\WebRoot" privileged="true" antiResourceLocking="false" antiJARLocking="false"> <!-- Link to the user database we will get roles from --> <Resource name="jdbc/pubs" // ...
<Context docBase="D:\myprj\WebRoot" privileged="true" antiResourceLocking="false" antiJARLocking="false"> auth="Container" type="javax.sql.DataSource" driverClassName=...
本文将详细介绍如何配置一个Java项目到Tomcat环境中,以便进行开发和测试。 首先,我们需要**安装JDK**。JDK(Java Development Kit)是Java编程的基础,提供了编译、调试和运行Java程序所需的工具和库。在官网下载...
<Context docBase="D:\Work\ZDNEWWORK\scheduler\webapp" path="/scheduler" reloadable="true" privileged="true" antiResourceLocking="false" antiJARLocking="false"> name="jdbc/FIN_DS" auth="Container...