同一个tomcat下面部署了两个项目,有一个访问不了404,web项目配置webAppRootKey
2016-05-20 11:12
891 查看
场景:刚接手了同事创建的项目,准备部署到服务器上(此tomcat下已经有了一个项目),部署好之后发现原有项目可以正常访问,但是新项目报404,怎么也访问不了。
问题排查:原来是同事拿之前的项目直接拷贝,然后在拷贝的项目上进行修改的。解决方案:
<!-- 应用路径 --> <context-param> <param-name>webAppRootKey</param-name> <param-value><span style="color:#ff0000;">webapp.root1</span></param-value> </context-param> <!-- 项目根目录Listener --> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener>
注意:
1、在应用的web.xml文件中,配置不同的webAppRootKey,<param-value>值可以自定义,只要相同tomcat下的各个工程保持不同即可。2、项目根目录listener,WebAppRootListener要在ApplicationContext的ContextLoaderListener之前,否则ApplicationContext的bean注入根目录值时会发生无法注入异常。
3、如果在web.xml中已经配置了 org.springframework.web.util.Log4jConfigListener 这个监听器,则不需要配置WebAppRootListener了。因为Log4jConfigListener已经包含了WebAppRootListener的功能。
4、根据以上修改以及1-3点注意之后,仍然无法访问404的,可能:(1)项目本身有问题。(2)因为是拷贝的项目,很多配置文件或者文件名、目录都是以前的,没有修改完全,特别是配置文件,logs目录等,仔细检查。(3)本人使用的spring-mvc+mybatis,如果你也是,可能是mybatis/mapper下文件为空,还没有映射但是你配置了。(4)以上无法解决,请查看tomcat下的logs文件中的异常信息,或者联系我,我们共同学习讨论。
参考资料:
log4j和web.xml配置webAppRootKey 的问题 1 在web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <param-value>web.sample.root</param-value> </context-param> 可以用System.getProperty("web.sample.root")来获取属性值。在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过上述语句打印出属性值,来看看临时项目路径在哪里 如:System.out.println("web.root:"+ System.getProperty("web.root")); 输出:web.root:D:\apache-tomcat-6.0.30\webapps\wangzun\ 2、Spring通过 org.springframework.web.util.WebAppRootListener 这个监听器来压入项目路径。但是如果在web.xml中已经配置了 org.springframework.web.util.Log4jConfigListener 这个监听器,则不需要配置WebAppRootListener了。因为Log4jConfigListener已经包含了WebAppRootListener的功能. 配置WebAppRootListener: <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener> 3、部署在同一容器中的多个Web项目,要配置不同的<param-value>,不能重复webAppRootKey的系统变量名 4.WebAppRootListener要在ApplicationContext的ContextLoaderListener之前,否则ApplicationContext的bean注入根目录值时会发生无法注入异常。 <!-- 项目根目录Listener --> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener> <!--Spring的ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 4、如果配置了 log4j.appender.file.File=${web.sample.root}WEB-INF/logs/sample.log log4j会自己自动建立logs目录, 不需要手工显式建立空的logs目录 在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下: <!-- 应用路径 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param> 最好报纸每个项目的参数值不同,以免引起项目冲突 严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\webapps\DRMProject\] instead of [C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\webapps\DRMSn\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 对多个项目要对webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下,如我配置这两个项目的webAppRootKey为 项目1 的 web.xml: <!-- 应用路径 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root1</param-value> </context-param> <!-- 项目根目录Listener --> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener> 项目2的 web.xml: <!-- 应用路径 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root2</param-value> </context-param> <!-- 项目根目录Listener --> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener> 这样就不会出现冲突了。 定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里。 然后log4j的配置文件里就可以用${webName.root }来表示Web目录的绝对路径,把log文件存放于webapp中。 namemax: <context-param> <param-name>webAppRootKey</param-name> <param-value>web.root</param-value> </context-param> <!-- 项目根目录Listener --> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener> bean中可以使用: <bean id="transformChinese" class="com.zunmi.util.TransformChinese" p:outBasePath="${web.root}WEB-INF/destineDomainFile/" p:j2fSource="${web.root}WEB-INF/SimpleToTraditional.properties" p:charSet="gbk" />
参考资料地址:http://www.verydemo.com/demo_c143_i3192.html
相关文章推荐
- Tomcat
- tomcat的connector与container原理分析(一)
- nginx+tomcat做动静分离配置+nginx+SSL
- tomcat配置调优
- tomcat缓存问题
- Apache 与Tomcat 服务器联合搭建一个稳定,动态,高效的web服务器
- tomcat 缓存导致的严重问题
- 在idea中部署远程Tomcat
- Tomcat的配置
- Eclipse Java EE IDE for Web Developers.配置Tomcat全攻略
- Tomcat 配置的数据源,测试连接数据库报告类转换错误
- 【 Tomcat 】后端tomcat获取真实IP
- Tomcat
- tomcat 加载硬盘
- tomcat怎么优化
- tomcat连接超时
- tomcat(12)org.apache.catalina.core.StandardContext源码剖析
- Tomcat配置远程调试端口
- 解决虚拟机上的tomcat无法被主机访问的问题
- 设置tomcat最大内存