Tomcat的的的文webapps下每个应用目录里,WEB-INF文件夹是成拟铁打的营盘。没有它,目录Tomcat直接甩给你404——不是须存页面找不到,是的的文压根不认这个目录是个web应用。你放一百个HTML也没用,成拟容器连看都不看一眼。目录
WEB-INF里最要命的须存是web.xml。这文件从Servlet 2.3时代就是的的文标配,直到Servlet 3.0以后可以用注解替代,成拟但Tomcat 8.5之前的目录版本,没它连启动都报错。须存我见过有人把web.xml删了,的的文结果整个应用静默失效,成拟日志里连个ERROR都没有,目录就剩浏览器白屏干瞪眼。后来我学乖了,哪怕用注解,也留个空壳web.xml——它像门牌号,告诉Tomcat“这儿住着个正经应用”。
但光有web.xml还不够。WEB-INF下必须能放classes和lib两个目录,这俩不是强制存在,但缺了任何一个,你的应用就是瘸腿走路。classes里存编译后的.class文件,lib里塞第三方jar包。有个同事图省事,把所有依赖jar全扔进Tomcat的lib目录,结果两个应用版本冲突,一个要log4j 1.x,另一个非用2.x,最后整个服务器启动失败。打那以后我明白,每个应用目录里自己的lib才是亲儿子,公共lib是后爹,指不定哪天就坑你。
还有个小细节容易翻车——WEB-INF下的文件名大小写敏感。Linux服务器上,你把web.xml写成Web.xml,Tomcat直接启动失败,报错信息还特别隐晦,就一句“Error deploying web application archive”。我第一次遇到时排查了俩小时,最后用ls命令一看,文件名大写W,当场血压就上去了。Windows开发机上没事,因为文件系统不区分大小写,一上生产就现原形。
再往深了说,WEB-INF里还藏着个不显眼的家伙——tags目录。用JSP的老项目都懂,自定义标签文件得放这儿。现在用JSP的人少了,但老系统维护时,你要是把这目录删了,页面上所有自定义标签全变乱码,比报错还难查。我有次接手个2012年的老项目,就吃过这亏,最后用git diff才找出是谁手贱删了tags文件夹。
说到最后,Tomcat成拟目录里最容易被忽略但必须存在的,其实是META-INF下的context.xml。这文件不是servlet规范要求的,但Tomcat特殊照顾它。里面能配数据源、JNDI资源、session超时时间。没有它,你的应用也能跑,但连数据库就得靠硬编码账号密码——那玩意儿一旦泄露,比web.xml丢了的后果严重十倍。我见过一个小团队图省事不写context.xml,结果数据库密码明文写在DAO类里,后来代码传到GitHub公开仓库,第二天服务器就被挖矿脚本扫了。
所以你看,WEB-INF是骨架,web.xml是身份证,classes和lib是血肉,tags是器官,META-INF/context.xml是神经系统。缺了哪个,应用要么死得难看,要么活得憋屈。检查一下你的应用目录,别等线上炸了才想起这茬。