`
desert3
  • 浏览: 2159364 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

tomcat reload&autodeploy log4j static静态变量 空指针错误

 
阅读更多
默认情况下,Tomcat在启动时会自动加载webapps目录下的项目(Host节的deployOnStartup属性),同时如果项目默认被监视的资源文件web.xml(context.xml中定义<WatchedResource>WEB-INF/web.xml</WatchedResource>)、class文件、或者lib目录下的jar文件发生变化,Tomcat会自动进行重加载、或者重Deploy操作
也可以使用probe项目对Tomcat下webapps中各项目进行管理,执行stop,start,reload等操作。

autoDeploy(HostConfig的check操作,然后调用StandContext的reload操作) 参考:Tomcat Web Application Deployment - Apache Tomcat 6.0
reloadable(WebappLoader的backgroundProcess操作,检查Context的reloadable属性,然后决定是否继续操作。) 参考:The Context Container  - Apache Tomcat Configuration Reference
由此可以看出autoDeploy和reloadable分别对应不同的操作,配置检查通过后,最终都会调用StandContext的reload来实现的。,需要注意的是,什么操作会触发后台线程ContainerBase内部类ContainerBackgroundProcessor的检查,以及分别对应什么操作(reload还是deploy)。

web.xml文件的修改会触发AutoDeploy,受host节的autoDeploy配置影响
class类文件修改会触发Reload操作,受reloadable配置影响

不管是上述的reloadable、autoDeploy、或者probe项目的reload操作,最终都会调用StandardContext的reload操作




而当执行完StandardContext的reload操作后,当被访问的请求代码中使用了log4j,logger会报空指针错误。根本原因是,StandardContext做reload操作时,其中一个步骤会调用WebappClassLoader的stop操作,而在WebappClassLoader的stop操作时,会根据变量ENABLE_CLEAR_REFERENCES的值(默认true),来清除static或者final变量的值,被清除后,再访问就自然会出错。

因此,
1,可以通过设置ENABLE_CLEAR_REFERENCES为false来解决这个问题(通过-Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES="false"来设置系统变量)
2,或者设置不进行重加载操作。context.xml中增加reloadable="false"属性
3,或者设置不进行自动Deploy操作。Host节中的autoDeploy="false"
4,Eclipse开发的话,Server属性中的把Automatically publish when resources chage改为Never publish automatically


org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES

If true, Tomcat attempts to null out any static or final fields from loaded classes when a web application is stopped as a work around for apparent garbage collection bugs and application coding errors.
There have been some issues reported with log4j when this option is true.
Applications without memory leaks using recent JVMs should operate correctly with this option set to false.
If not specified, the default value of true will be used.

System Properties  - Apache Tomcat Configuration Reference

分享到:
评论

相关推荐

    解决log4j:ERROR Failed to rename代码包

    log4j:ERROR Failed to rename错误解决办法 http://www.blogjava.net/DreamAngel/archive/2011/11/10/363400.html

    slf4j-reload4j-1.7.36.jar

    slf4j-reload4j-1.7.36.jar 是 SLF4J (Simple Logging Facade for Java) 的一个绑定模块,用于将 SLF4J 与 reload4j 日志框架相连接。reload4j 是 Apache log4j 1.2.17 的一个分支,目的是为了修复一些安全问题,...

    让MyEclipse里的Tomcat自动Reload

    让MyEclipse里的Tomcat自动Reload

    log4j各种配置连接

    7. **动态配置**:Log4j还支持动态更新配置,通过`JMX`(Java Management Extensions)或者`log4j-reload.jar`,可以在运行时修改配置,无需重启应用。 8. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和 ...

    tomcat之Linux版

    【标题】"Tomcat在Linux环境下的部署与配置" 【正文】 Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,它是一个开源的、免费的Web应用服务器,主要用于Servlet和JSP的运行。在Linux操作系统上部署和管理...

    Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例)

    在Linux(CentOS7)操作系统中安装Apache Tomcat并将其设置为开机启动是一项常见的任务...记住,根据你的具体需求,可能还需要配置环境变量、调整Tomcat配置文件,以及设置用户权限等,以确保Tomcat能稳定、安全地运行。

    Tomcat 6 Linux版

    4. **配置环境变量** 在用户主目录的 `.bashrc` 或 `.bash_profile` 文件中添加以下内容来设置 `CATALINA_HOME` 环境变量: ``` export CATALINA_HOME=/opt/tomcat6 export PATH=$PATH:$CATALINA_HOME/bin ``` ...

    install4j官方帮助文档

    install4j是一款由ej-technologies GmbH开发的安装程序构建工具,它提供了一套完整的解决方案来创建跨平台的安装程序。它支持Windows, macOS和Linux操作系统上的安装程序制作,并且具有图形用户界面和易于使用的向导...

    解决Tomcat在修改代码后不会自动reload的问题

    然而,在开发过程中,我们经常遇到一个问题:修改了Java代码后,Tomcat不会自动重新加载(reload),导致改动无法立即生效。这无疑降低了开发效率。本文将详细介绍如何解决Tomcat在修改代码后不会自动reload的问题。...

    centOS7设置Tomcat8开机启动

    在Linux系统中,尤其是CentOS 7,配置Apache Tomcat 8作为开机启动服务是确保服务器启动时自动运行Web应用程序的关键步骤。这个过程对于软件实施工程师来说非常重要,因为它可以简化维护工作,避免每次系统重启后...

    apache-tomcat7 linux

    4. **设置环境变量** 为了方便使用,需要设置环境变量 `CATALINA_HOME` 指向Tomcat的安装目录: ``` echo "export CATALINA_HOME=/opt/apache-tomcat-7.0.40" &gt;&gt; ~/.bashrc source ~/.bashrc ``` 5. **启动...

    centos设置tomcat开机自启动

    ### CentOS 设置 Tomcat 开机自启动 #### 一、前言 在生产环境中,为了确保应用服务器能够稳定运行,我们通常需要配置应用服务器在系统重启后自动启动。本篇文章将详细介绍如何在CentOS环境下配置Tomcat服务器实现...

    apache-tomcat-8.5.55.tar.gz

    因为Tomcat运行需要Java环境,所以请确认已安装JDK 8或更高版本,并且`JAVA_HOME`环境变量设置正确。如果没有安装,可以通过以下命令安装: ```bash sudo apt-get update sudo apt-get install default-jdk ``` ...

    分割Tomcat日志

    /etc/init.d/tomcat reload &gt; /dev/null endscript } ``` 上述配置表示每天轮转一次日志文件,保留最近7天的日志,并将其压缩;如果日志文件不存在则忽略错误,创建新文件时赋予640权限,并确保重启服务。 2. ...

    linux环境下tomcat的启动、关闭及常见问题

    5. **日志分析**:通过查看`catalina.out`和`localhost.log`等日志文件,定位并解决错误。 六、自动化启动 为了使Tomcat在系统启动时自动启动,可以将Tomcat服务添加到`systemd`: 1. 创建`/etc/systemd/system/...

    tomcat-7.0.52.tar.gz 【linux】

    安装tomcat 1.下载tomcat 2.上传到linux 3.新建一个文件夹 mkdir /usr/local/tomcat 4.移动或者复制 tomcat...tar.gz 到 /usr/local/tomcat mv apache-tomcat-7.0.52.tar.gz /usr/local/tomcat/ 5.进入/usr/...

    apache-tomcat-5.5.36.tar.gz

    4. **启动和停止Tomcat**: - 启动Tomcat: ``` sudo /opt/apache-tomcat-5.5.36/bin/startup.sh ``` - 停止Tomcat: ``` sudo /opt/apache-tomcat-5.5.36/bin/shutdown.sh ``` 5. **配置Tomcat服务**: -...

    express-static-livereload:一个用于实时重新加载静态文件的快速中间件

    express-static-livereload a express middleware to livereload static files Installation $ npm install express-static-livereload --save-dev Usage var express = require('express'); var app = express(); ...

    linux的tomcat7.0安装包

    **四、解压Tomcat** 下载完成后,解压缩文件: ```bash tar -zxvf apache-tomcat-7.0.47.tar.gz ``` 这将创建一个名为`apache-tomcat-7.0.47`的目录。 **五、移动Tomcat到指定目录** 为了保持系统整洁,通常将...

    zlog---比log4c更牛的c语言日志库

    可以灵活配置日志输出的格式,类似于log4j的pattern layout 纲目分类模型,比log4j系列的继承模型更加清晰 多种输出,包括动态文件、静态文件、stdout、stderr、syslog 可以在运行时动态刷新配置,只需要调用函数...

Global site tag (gtag.js) - Google Analytics