且不论很是热火的解决方案, 就表面感觉而言, 一个程序会执行两次, 那么必需是调用了两次程序。但从我们的配置上看来只定义了一次:
<Host name="lanvideo.cn" appBase="lanvideo"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="LanVideo" />
</Host>
目录结构:
$ ls lanvideo
LanVideo.war
但从实际的启动效果来看,情况却非如此:
$ bin/startup.sh
$ ls lanvideo
LanVideo.war
LanVideo
ROOT
实际解压出现LanVideo和ROOT两个目录, 并且目录里内容相同, 这就不难解释Quartz会执行两次的问题了。
问题发现了, 怎么解决呢?
先看看文档上的描述:
http://localhost:8080/docs/virtual-hosting-howto.html
这是采用了在conf/Catalina/lanvideo.cn下用ROOT.xml替代server.xml的Context的方式:
删除server.xml中Context的定义:
<Host name="lanvideo.cn" appBase="lanvideo"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
新建conf/Catalina/lanvideo.cn/ROOT.xml
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="LanVideo">
</Context>
删除已经发布的LanVideo和ROOT文件夹后重启服务器。
$ ls lanvideo
LanVideo.war
LanVideo
貌似解决这个问题了。可是访问是却是404。
$ curl -i http://lanvideo.cn:8080
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 952
Date: Tue, 28 Dec 2010 08:59:57 GMT
看来官方的指南也解决不了问题。访问还是会依赖ROOT文件夹里的程序。
走到这一步说明说明正道不可走, 走偏门:
更改配置:
<Host name="lanvideo.cn" appBase="lanvideo"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="LanVideo.war" />
</Host>
为什么是引向war?因为Context的unpackWAR属性会将docBase指向的war自动发布到path指定的地方。所以,利用这点,可以让它正常发布到ROOT文件夹下。
然后,在lanvideo下建立空的文件夹LanVideo,通过tomcat的发布检查,避开自动发布到LanVideo文件夹,只保留ROOT文件夹里的内容。
如此:
$ ls lanvideo
LanVideo.war
LanVideo
ROOT
$ ls lanvideo/LanVideo
$ ls lanvideo/ROOT
...
$ curl -I http://lanvideo.cn:8080
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=7B057642D076C8B9F33DA7A4401EE288; Path=/
Content-Type: text/html;charset=utf-8
Content-Length: 3915
Date: Tue, 28 Dec 2010 09:34:19 GMT
搞定!
附:
网上很多方案是说更改appBase, 我猜那些人也是这样找到的偏门吧, 不过妄称appBase设定错误, 我可不敢苟同。