问题现象
主要的目录结构
index.jsp
test/test.jsp
WEB-INF/web.xml
WEB-INF/classes/MyClass.class
2个JSP里面全都调用了MyClass.class
程序内容完全相同,是复制过去改文件名的。
访问 http://127.0.0.1/index.jsp 没有任何问题
访问 http://127.0.0.1/test/test.jsp 报 ClassNotFoundException
服务器其是Tomcat 5.5
故障查找
经过程序测试,发现在/index.jsp里面包含了需要的CLASSAPTH目录,也就是 /WEB-INF/classes
而在 /test/test.jsp 里面,竟然不包含这个目录,当然也就无法访问MyClass类了
查看Tomcat/conf/server.xml, 发现如下配置
主要的目录结构
index.jsp
test/test.jsp
WEB-INF/web.xml
WEB-INF/classes/MyClass.class
2个JSP里面全都调用了MyClass.class
程序内容完全相同,是复制过去改文件名的。
访问 http://127.0.0.1/index.jsp 没有任何问题
访问 http://127.0.0.1/test/test.jsp 报 ClassNotFoundException
服务器其是Tomcat 5.5
故障查找
经过程序测试,发现在/index.jsp里面包含了需要的CLASSAPTH目录,也就是 /WEB-INF/classes
而在 /test/test.jsp 里面,竟然不包含这个目录,当然也就无法访问MyClass类了
查看Tomcat/conf/server.xml, 发现如下配置
复制内容到剪贴板
代码:
<Host
appBase="e:/abc"
name="abc.123.net"
<Context
path="/"
docBase="e:/abc"
</Context>
</Host>
其中appBase 和 根的 docBase 指向了同一个目录。问题找到了
故障分析
appBase 的作用是,改目录将作为所有应用的根目录,其下面的任何一个子目录都将成为虚拟目录。
如果你把war文件放到这里,将会被自动解包,并配置成虚拟目录运行
因为每个虚拟目录都有自己独立的CLASSPATH,所以
/test/test.jsp 被服务器解析为一个独立的虚拟目录,其CLASSPATH 应该在
/test/WEB-INF/classes 里面
故障排除
原因找到了,排除很简单
1 修改appBase到默认目录 appBase="webapps" 推荐这么做
2 修改appBase 到你指定的应用目录,比如 d:/project 目录,然后把你的项目放到这个目录的子目录里面,比如
d:/project/myRoot/index.jsp
d:/project/myRoot/test/test.jsp
d:/project/myRoot/WEB-INF/web.xml
d:/project/myRoot/WEB-INF/classes/MyClass.class
然后对docBase进行修正
这样就可以了!