tomcat 通过server.xml静态部署web项目访问报java.lang.ClassNotFoundException,找不到相应的servlet
server.xml配置文件的大致结构如下:
<server>
<service>
<connector/>
<engine>
<host>
<context/>
</host>
</engine>
</service>
</server>
1 先简单了解一下server.xml中的配置
* server元素:是整个配置文件的根元素,代表整个tomcat的容器
* service元素:一个server元素包含一个或多个service元素
* connector元素:一个service元素可以包含多个connector元素
* engine元素:一个service元素中只可以包含一个engine元素
* host元素:一个engine元素可以包含多个host元素
* context元素:一个host元素可以包含多个context元素
各元素的作用可以参考:https://www.cnblogs.com/kismetv/p/7228274.html
2 静态配置web项目
我们要配置web项目,可以在engine元素中再建一个host元素,如下:
<Host name="127.0.0.1" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/ClassLoaderTest" docBase="/Users/zyq/Documents/workspace/ClassLoaderTest/WebContent" reloadable="true" />
</Host>
注意:engine元素中有一个属性defaulthost,它指定了默认的host名称,当发往本机的请求指定的host不存在时,一律使用它指定的host进行处理,因此它的值必须与engine中的一个host元素的name属性值相匹配。假如已经有一个host元素的name值和defaulthost值一致了,下个host元素的name值不要再用一样的了。
path:静态部署时它的值可以显示指定,可以指定是项目的名称
docBase:项目中的webRoot路径
reloadable:当tomcat运行时,监控WEBINFO/classes和WEBINFO/lib目录下的变动,如果值为true,当目录下有变动时,会重新加载。
3 部署情况
我的eclipse是Mars版本,创建web项目时选择的是:
生成的目录结构是这样的:
web.xml:
生成的项目结构中,classes文件不在webinfo目录下面,所以启动tomcat的时候访问127.0.0.1:8080/ClassLoaderTest/hw时报java.lang.ClassNotFoundException,not found ....hwServlet这个servlet。
编译后的class文件不在webinfo目录下,所以就找不到相应的servlet。
解决:只要把classes文件复制到webinfo目录下就可以了,访问就正常了。