Idea web项目启动有资源但仍然显示404
作者:mmseoamin日期:2023-12-14

向朋友要了项目,尝试在自己的电脑上运行时,自动打开的 "localhost/login.jsp" 显示404错误。

背景

项目是在朋友那直接压缩发过来的,所以项目的配置文件也保留了,用自己的电脑需要修改部分配置。主要修改了Maven相关的路径以及本地tomcat的路径(版本不一致)。

问题

在修改完报错的配置之后,直接运行项目。自动打开的网址为 "localhost/login.jsp",但是显示404错误,即路径不对。

于是我初步检查了一下,把原来的端口80改成8080,用Maven清理之后重新打包了。重新运行仍然显示404错误。然后百度了一下,检查了target文件夹下的资源都齐全,运行时部署的确实是当前项目,但结果一样。毫无头绪,只能从日志里找线索。对日志里的CATALINA_BASE的路径"C:\Users\Admin\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\login_jsp_project"感到疑惑,于是继续搜索相关资料。

最后发现了,朋友是在他的电脑上可以用 "localhost/xxx" 直接访问项目资源,意味着他的项目是部署到tomcat的根目录下了。而我的项目部署在 "/project_war" 下,需要访问 "localhost/project_war/xxx" 才可以,所以接下来就是找出哪里设置就可以了。

解决方法

1.target目录下没有对应资源(不是我遇到的问题,也记录了)

在Idea上直接运行tomcat或者用Maven打包均会在项目根目录生成target文件夹,target文件夹下的project-1.0-SNATSHOT 和 project-1.0-SNATSHOT.war 就是在tomcat上运行的项目文件夹

Idea web项目启动有资源但仍然显示404,第1张

文件名字在 pom.xml 里面定义

 Idea web项目启动有资源但仍然显示404,第2张

 检查上面提到的项目文件夹里是否存在你要访问的资源,如果没有就从 webapps 里面复制过去就可以了。

 2.配置虚拟目录(我遇到的问题)

 根据日志信息中 CATALINA_BASE 路径,打开文件夹

Using CATALINA_BASE:   "C:\Users\Admin\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\login_jsp_project"

Using CATALINA_HOME:   "D:\Apache-tomcat-9.0.20"

( 其中日志信息中的 CATALINA_HOME 代表tomcat的安装目录,CATALINA_BASE代表工作目录或者项目目录)

Idea web项目启动有资源但仍然显示404,第3张

 再打开 "conf\Catalina\localhost" 下的 xxx.xml ,能看到内容如下

context标签可以用于将本地系统中一个目录映射为可供web浏览器访问的虚拟目录。path属性指定web应用的虚拟路径。docBase属性用于指定该虚拟目录所在本地系统中的目录地址,可以用绝对地址或者相对于webapps目录的相对地址。

拿上面的内容举例,就是访问 "localhost/project_war/xxx" 会访问电脑上 "D:\project\target\project-1.0-SNAPSHOT.war" 这个目录下的xxx资源。

那找到了地方就可以检查对应的path是否正确。

这个path在 Idea 的 Run -> Edit Configurations 里面设置,点击Deployment

Idea web项目启动有资源但仍然显示404,第4张

 下面的 Application context 就是我们在运行项目时,idea会在上述context标签里path属性里写的内容, 当值为空的时候,就会把项目设置为默认项目,即访问 "localhost/xxx" 即可,此时 context标签的 path=""

Idea web项目启动有资源但仍然显示404,第5张

 再次运行项目,效果就和朋友打开的一样了。

额外补充

context代表虚拟主机host上运行的单个web应用,通过配置context元素可以灵活的发布web应用。context可以在很多地方配置,但是tomcat会以一定顺序的查找该元素,如果找到就使用该元素不会继续查下去。因此不同地方的context元素有优先级。查找顺序如下:

  1. /conf/context.xml文件中查找context元素,该文件适用于所有web应用
  2. /conf/[enginename]/[hostname]/context.xml.default中查找context元素。适用于所有web应用。
  3. /conf/[enginename]/[hostname]/[contextpath].xml文件中查找,只适用于单个web应用。
  4. 到web应用的META-INF/context.xml文件中查找context元素,只适用于当前web应用。
  5. /conf/server.xml文件中的host元素中查找context元素。可以在serverl.xml中配置所有的web应用的context元素,但是由于优先级最低,极有可能会被其他context元素覆盖。

参考及引用

IDEA中maven项目成功启动tomcat 但jsp页面显示404_idea启动tomcat404_好好学习yyy的博客-CSDN博客

Idea配置tomcat的一些细节 - 简书 (jianshu.com)

tomcat中Context的path和docBase属性_context docbase_千霜的博客-CSDN博客

tomcat基础_tomcat host context 优先级_千霜的博客-CSDN博客

侵权联系删

欢迎指出错误