游客发表
昨天下午,部署r包隔壁组的访问小王又踩坑了。他打包好的部署r包war包丢进tomcat的webapps目录,启动服务,访问浏览器敲下访问地址,部署r包404。访问页面干干净净,部署r包就一行字——"The 访问origin server did not find a current representation for the target resource or is not willing to disclose that one exists."
这不是他第一次遇到这问题。上个月部署同一个项目,部署r包也是访问404,查了半天发现是部署r包路径大小写写错了。这次呢?访问我凑过去看了一眼他的tomcat日志,catalina.out里没有异常,部署r包localhost.log里也没有报错。访问war包解压出来的部署r包目录名是"myapp",访问地址却写的是"localhost:8080/myApp/"——又是大小写。但这次他改了,还是404。
我让他把tomcat的webapps目录截图发我。好家伙,war包还在,但旁边多了一个同名文件夹和一个同名.war的临时文件。tomcat默认开启autoDeploy,war包丢进去会自动解压。可如果之前部署过旧版本,tomcat会保留旧的解压目录,新war包覆盖不了同名目录,启动时可能加载的是旧目录里的脏数据。他这次是第二次部署,第一次部署时手动删了webapps下的文件夹,但没删干净,残留了一个空目录。新war包解压失败,tomcat只认那个空目录,自然404。
解决办法很粗暴:停掉tomcat,把webapps下所有同名文件和目录删干净,再重新丢war包,启动。这次他学乖了,部署前先检查webapps目录里有没有残留。其实tomcat部署war包访问404,八成是这几个原因——路径写错、war包没解压成功、或者解压后的目录结构和访问路径不匹配。
路径写错最常见。tomcat访问地址是"http://localhost:8080/项目名/资源路径",项目名就是war包的文件名,不包括.war后缀。如果你打包时artifactId叫"my-web",war包名就是"my-web.war",访问地址就得写"localhost:8080/my-web/"。有人图省事,把war包改名成"ROOT.war",那访问地址就是"localhost:8080/"直接根路径,不加项目名。这俩搞混了,404跑不了。
war包没解压成功,这个隐蔽。tomcat启动时如果检测到war包比同名目录新,会重新解压。但如果你之前手动解压过,或者目录里有文件被占用(比如Windows下有个进程锁住了jar包),解压就会失败。tomcat日志里一般会报"Unable to expand"之类的错,但很多人根本不看日志,直接查浏览器。
还有一种情况,war包里的路径和访问路径不一致。比如你用spring boot打war包,内嵌tomcat和外部tomcat的路径处理方式不同,部署到外部tomcat时可能默认加了一层context path。这问题多见于老项目改造,新手容易懵。
最后说个细节——tomcat的conf/server.xml里有个Host的appBase配置,默认是webapps。如果你改了appBase指向别的目录,war包丢webapps里根本不会被扫描到,404是必然的。检查这个配置的人少,但真有人改过。
小王这次的问题是残留目录。我让他删干净重启,页面正常了。他嘀咕了一句:"tomcat这玩意儿,部署个war包怎么这么多坑。"我回他:"不是坑多,是你没把它当回事。先看日志,再查路径,最后检查残留,三步走完,404基本能解决。"
友情链接