2011-01-22 78 views
5

我们有一套在tomcat引擎上运行的servlet。当我们编译一个java文件并构建这场战争时,tomcat需要花费不确定的时间来重新加载它。有时3秒,有时30秒等。目前的解决方法是停止tomcat并使用shell脚本重新启动它。我们将autodeploy和reloadable标志设置为true,但不能可靠地工作。任何想法如何做到这一点?指针也赞赏。这是关于ubuntu上的tomcat v6.0.20。如何强制tomcat重新加载最近编译的类/ war文件

这里是我们conf/server.xml文件的提取物:

<Engine name="Catalina" defaultHost="localhost"> 

    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
     resourceName="UserDatabase"/> 

    <Host name="localhost" appBase="webapps" 
     unpackWARs="true" autoDeploy="true" 
     xmlValidation="false" xmlNamespaceAware="false"> 

    <DefaultContext reloadable="true"> 
    </DefaultContext> 

    <!-- SingleSignOn valve, share authentication between web applications 
     Documentation at: /docs/config/valve.html --> 
    <!-- 
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
    --> 

    </Host> 
</Engine> 

回答

6

一种可能性是将发送适当的请求到Tomcat Manager App;例如是这样的:

http://localhost:8080/manager/text/reload?path=/examples 
+0

这就是我们的解决方法脚本正在做的 - 停止Tomcat,等待(休眠)几秒钟,启动它,再睡一会儿,然后发出一个URL请求(wget $ tomcatURL)。有一半时间我们收到错误消息,在这种情况下,我们只是重新运行脚本。当我们没有得到错误信息并获得一些html内容时,我们知道tomcat已经开始使用当前的war/class文件。我会说,真是糟糕的开始守护进程的方法。 – 2011-01-22 03:19:01

1

如果你有这个问题的发展,我强烈建议jetty。它可嵌入您的代码中,以便您可以在代码中运行一个类并为您的web应用程序启动服务器!

如果你使用它作为你的构建环境(我记得在Eclipse中调试Tomcat应用程序,但我忘记了它是如何的),你可以在Eclipse中调试应用程序,制作一个ant构建目标来运行jetty(即ant jetty),或者使用maven使用jetty插件启动您的码头服务器(mvn jetty:run)。

通过jetty,您还可以托管类似于Tomcat的服务器,您可以在其中复制新的战争并立即生效。

我们使用Tomcat作为我们的服务器应用程序,因为支持人员很熟悉它,但是我发现jetty对于开发至关重要。

0

有时候,我做的是从删除的文件夹或类别的tomcat /工作/卡塔利娜/ ...