同一个tomcat下面部署了两个项目,有一个访问不了404,web项目配置webAppRootKey

简介:

同一个tomcat下面部署了两个项目,有一个访问不了404,web项目配置webAppRootKey


场景:刚接手了同事创建的项目,准备部署到服务器上(此tomcat下已经有了一个项目),部署好之后发现原有项目可以正常访问,但是新项目报404,怎么也访问不了。

问题排查:原来是同事拿之前的项目直接拷贝,然后在拷贝的项目上进行修改的。
 
解决方案:

[javascript] view plain copy

  1. <!-- 应用路径 -->
  2. <context-param>
  3.     <param-name>webAppRootKey</param-name>
  4.     <param-value><span style="color:#ff0000;">webapp.root1</span></param-value>
  5. </context-param>
  6. <!-- 项目根目录Listener -->
  7. <listener>
  8.     <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  9. </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文件中的异常信息,或者联系我,我们共同学习讨论。
 
 
参考资料:

[javascript] view plain copy

  1. log4j和web.xml配置webAppRootKey 的问题
  2. 1 在web.xml配置
  3. <context-param>
  4.   <param-name>webAppRootKey</param-name>
  5.   <param-value>web.sample.root</param-value>
  6. </context-param>
  7. 可以用System.getProperty("web.sample.root")来获取属性值。在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过上述语句打印出属性值,来看看临时项目路径在哪里
  8. 如:System.out.println("web.root:"+ System.getProperty("web.root"));
  9.     输出:web.root:D:\apache-tomcat-6.0.30\webapps\wangzun\
  10. 2、Spring通过 org.springframework.web.util.WebAppRootListener 这个监听器来压入项目路径。但是如果在web.xml中已经配置了 org.springframework.web.util.Log4jConfigListener 这个监听器,则不需要配置WebAppRootListener了。因为Log4jConfigListener已经包含了WebAppRootListener的功能.
  11. 配置WebAppRootListener:
  12.  <listener>
  13.   <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  14.  </listener>
  15. 3、部署在同一容器中的多个Web项目,要配置不同的<param-value>,不能重复webAppRootKey的系统变量名
  16. 4.WebAppRootListener要在ApplicationContext的ContextLoaderListener之前,否则ApplicationContext的bean注入根目录值时会发生无法注入异常。
  17.    <!-- 项目根目录Listener -->
  18.  <listener>
  19.   <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  20.  </listener>
  21.  <!--Spring的ApplicationContext 载入 -->
  22.  <listener>
  23.   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  24.  </listener>
  25. 4、如果配置了
  26. log4j.appender.file.File=${web.sample.root}WEB-INF/logs/sample.log
  27. log4j会自己自动建立logs目录, 不需要手工显式建立空的logs目录
  28. 在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:
  29. <!-- 应用路径 -->
  30. <context-param>
  31. <param-name>webAppRootKey</param-name>
  32. <param-value>webapp.root</param-value>
  33. </context-param>
  34. 最好报纸每个项目的参数值不同,以免引起项目冲突
  35. 严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
  36. 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!
  37. 对多个项目要对webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下,如我配置这两个项目的webAppRootKey为
  38. 项目1 的 web.xml:
  39. <!-- 应用路径 -->
  40. <context-param>
  41. <param-name>webAppRootKey</param-name>
  42. <param-value>webapp.root1</param-value>
  43. </context-param>
  44.  <!-- 项目根目录Listener -->
  45.  <listener>
  46.   <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  47.  </listener>
  48. 项目2的 web.xml:
  49. <!-- 应用路径 -->
  50. <context-param>
  51. <param-name>webAppRootKey</param-name>
  52. <param-value>webapp.root2</param-value>
  53. </context-param>
  54.  <!-- 项目根目录Listener -->
  55.  <listener>
  56.   <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  57.  </listener>
  58. 这样就不会出现冲突了。
  59. 定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里。
  60. 然后log4j的配置文件里就可以用${webName.root }来表示Web目录的绝对路径,把log文件存放于webapp中。
  61. namemax:
  62.  <context-param>
  63.   <param-name>webAppRootKey</param-name>
  64.   <param-value>web.root</param-value>
  65.  </context-param>
  66.  <!-- 项目根目录Listener -->
  67.  <listener>
  68.   <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  69.  </listener>
  70. bean中可以使用:
  71.    <bean id="transformChinese" class="com.zunmi.util.TransformChinese"
  72.          p:outBasePath="${web.root}WEB-INF/destineDomainFile/"
  73.          p:j2fSource="${web.root}WEB-INF/SimpleToTraditional.properties"
  74.          p:charSet="gbk"
  75.         />
相关文章
|
18天前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
44 1
|
1月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
39 5
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
148 1
|
2月前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
67 1
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
138 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
152 45
|
17天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
30 2
|
1月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
43 1
|
1月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
51 2