工作中遇到多个项目版本并行开发的问题,所以把下载的版本重新编辑项目名称导入eclipse,eg. Test、Test1.0.0、Test1.0.2等等。当时只是简单的把eclipse的.project的配置文件中的项目名称给修改了。导致在使用tomcat部署项目的时候会出现项目被启动两次的情况。
tomcat server.xml配置:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
<ContextdocBase="Test1.5.0"path="/Test"reloadable="true"source="org.eclipse.jst.jee.server:Test1.5.0"/></Host>
部署完成之后,context的属性docBase与path的值不一致,差了个版本号问题。这时在启动项目的时候,如果项目中创建Socket通信的监听端口,就会有报错信息,提示XXX端口好已经被绑定。其实这个时候该项目被部署了两次,导致启动报错。
解决方法:
1.最简单的修改方式就是把path的值改成docBase的值。
此处可以修改项目的"Web project setting",在properties里面,修改这个参数为docBase的值就可以了。
2.只把项目部署在webapps下,不配置Context元素。
原因:
原因补充很清楚,但是查看了tomcat的官方文档:
path:
Even when statically defining a Context in server.xml, this attribute must not be set unless either the docBase is not located under the Host's appBase
or both deployOnStartup
and autoDeploy
are false. If this rule is not followed, double deployment is likely to result.
假如docBase的目录已经在appBase配置的目录下,或者deployOnStartup与autoDeploy都为false,就不需要配置path属性。如果配置了,就极有可能导致双重部署的结果。
找到了原因还是很开心的,但是不知道tomcat启动原理还是硬伤!路还很长......