同一个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.         />
相关文章
|
7月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
685 1
|
8月前
|
运维 数据可视化 C++
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
2025年热门Web化容器部署工具对比:Portainer与Websoft9。Portainer以轻量可视化管理见长,适合技术团队运维;Websoft9则提供一站式应用部署与容器管理,内置丰富开源模板,降低中小企业部署门槛。两者各有优势,助力企业提升容器化效率。
516 1
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
|
8月前
|
Java jenkins 应用服务中间件
结合Jenkins与Tomcat,实施Maven项目的自动构建和部署流程。
任何项目构建和部署的自动化流程,总离不开对各个环节精细把控与密切配合。涉及到源代码管理、构建工具、持续集成服务器以及最终的运行时环境的协调。通过上述简洁实用的步骤,可以实现Maven项目从源代码到运行状态的无缝过渡,进而提升软件开发的效率与质量。
431 0
|
8月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
889 64
|
9月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
739 0
|
负载均衡 测试技术 应用服务中间件
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1244 5
|
10月前
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
281 56
|
11月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
604 11