2009-12-09 60 views
21

为什么我们需要重新启动一个tomcat服务器,每当一个类文件被改变时,有没有别的办法?更改类文件时重新启动tomcat?

+0

我也注意到了这个问题。做这件事的一个痛苦的方法是改变你的web.xml两次:一次到一些随机的HelloWorld类,然后回到你改变的类。很高兴我在这里得到了答案。 – theindigamer 2014-08-24 05:40:45

+0

这个问题是因为你想保持最低生产停机时间?那么tomcat的设置不会对你有所帮助。它已经在官方文档中描述过了。 – ha9u63ar 2018-01-10 20:49:50

回答

27

您可以配置Tomcat,让你的web应用“重新加载”。为此,请将reloadable=true添加到Web应用程序的<Context>元素中。关于reloadable属性,则documentation说:

设置为true如果你想卡塔利娜监测/WEB-INF/classes//WEB-INF/lib更改类,并自动如果检测到变化重新加载Web应用程序。此功能在应用程序开发过程中非常有用,但它需要大量的运行时间开销,不建议用于已部署的生产应用程序。这就是为什么该属性的默认设置为false。但是,您可以使用Manager Web应用程序触发按需重新部署已部署的应用程序。

+3

*叹*给我的投票给帕斯卡尔,他是更有用和全面的答案。看着他,似乎开发模式只检查JSP中的变化,这不是OP询问的内容。 – 2009-12-09 13:43:50

6

当然是有!以开发模式启动Tomcat,然后每个Web应用程序将在重新部署后自动重新启动。

从Tomcat文档:

它实现碧玉是在全局$ CATALINA_BASE/conf目录/ web.xml中使用初始化参数配置这个servlet。

...

发展 - 是碧玉用于开发模式(将检查JSP的修改对每个接入)? true或false,默认为true。

您可以更改某些设置以调整Tomcat查找更新的确切内容。我通常WEB-INF/classes下部署单独的类文件到相应目录,然后

touch WEB-INF/web.xml

来启动应用程序的重新启动;我认为web.xml是Tomcat默认检查的文件之一。

+2

我可能是错的,但这似乎取自* Jasper 2 JSP Engine How To *(http://tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html)并且适用于JSP,而不是类。 – 2009-12-09 13:46:22

+0

呐,你照例是正确的;) – 2009-12-09 17:10:28

0

如果您使用WAR文件进行部署,就可以在Tomcat的配置,这将导致Tomcat的观看Web应用程序根(“web应用”默认情况下)为新的或变更WAR文件设置autoDeploy=true。如果找到这样的文件,它会自动部署。

帕斯卡Thivent说,虽然,你可以使用Tomcat管理器应用程序(/经理/ HTML)的启动,停止,部署和取消部署的具体应用。如果您正在更改的文件位于特定应用程序中,则这是让Tomcat识别更改的好方法。

1

如果你开发,你的IDE应该能够透明地做到这一点适当的服务器上。例如。 Eclipse中的Dynamic Web Project知道如何与Tomcat交谈。

如果部署,然后创建WAR-文件和部署这些。 Tomcat知道如何重新部署WAR文件。

5

在更一般的说明中,您必须这样做的原因是因为在Java中,当类加载器加载类时,无法卸载它。 Tomcat需要做的是使用新的类加载器并重新加载所需的所有类。

0

除了在server.conf中设置autoDeploy = true之外,还应该注意不要在共享类加载器中放置任何类。由共享类加载器加载的类不能重新加载。

0

您的问题实际上并没有说明您是否担心生产停机(即通过重新加载类来减少它),或者您希望不停地开发。所以我会尝试使用以下几点澄清:使用<Context reloadable=true...

1)在你的catalina.home/conf目录,你可以确保你的web应用程序重新加载时,任何类的变化。您可以在<WatchedResources>元素中添加资源更改关注列表。

2)但是,这将刷新背景下,重新初始化类加载器,空它的高速缓存,一切都会如同web应用才刚刚起步。

这种方法仍然会让您的服务器无法使用,因为您已经重新加载了Servlet的上下文。真正的“重新加载”是

1)您交换类的字节代码,但有一些限制 2)当为该类加载器调用“loadClass()”时,JVM将返回该类。

这是java仪器。您可以编写自己的代理程序,该代理程序可以在开始或运行时挂接到您的JVM。但是,您不能定义新方法,并更改静态变量。这些是JVM本地限制(对于我知道的Oracle HotSpot JVM)。您可以使用不同的JVM,例如DCEVM没有这样的限制。所以这取决于你如何处理你的问题。如果你知道你在做什么(!),你可以逐个替换类。你甚至可以定义一个“全新的类”,在现有的/加载的类中引用类对象/方法,并用它来检索变化。

我希望这会有所帮助。这里的所有答案都是你做出决定所需要的。

相关问题