更改类文件时重启tomcat?

时间:2009-12-09 13:32:12

标签: java class tomcat

为什么我们需要在更改类文件时重新启动tomcat服务器,是否有其他办法?

8 个答案:

答案 0 :(得分:29)

您可以配置Tomcat并使您的webapp“可重新加载”。为此,请将reloadable=true添加到您的网络应用的<Context>元素中。关于reloadable属性,documentation说:

  

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

答案 1 :(得分:7)

肯定有!在开发模式下启动Tomcat,然后每个webapp将在重新部署后重新启动。

来自Tomcat文档:

  

实现Jasper的servlet是使用全局$ CATALINA_BASE / conf / web.xml中的init参数配置的。

...

  

开发 - Jasper是否在开发模式下使用(将在每次访问时检查JSP修改)? true或false,默认为true。

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

touch WEB-INF/web.xml

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

查看JRebel

答案 4 :(得分:1)

如果您开发,您的IDE应该能够在合适的服务器上透明地执行此操作。例如。 Eclipse中的Dynamic Web Project知道如何与Tomcat通信。

如果部署,则创建WAR文件并部署它们。 Tomcat知道如何重新部署WAR文件。

答案 5 :(得分:0)

如果您正在使用WAR文件进行部署,则可以在Tomcat配置中设置autoDeploy=true,这会导致Tomcat为新的或更改的WAR文件监视Web应用程序根目录(默认情况下为“webapps”)。如果找到这样的文件,它将自动部署。

正如Pascal Thivent所说,您可以使用Tomcat Manager应用程序(/ manager / html)来启动,停止,部署和取消部署特定应用程序。如果您要更改的文件位于特定应用程序中,这是让Tomcat识别更改的好方法。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您的问题实际上并未说明您是否担心生产停机(即通过重新加载类来减少它),或者您希望不间断开发。所以我将尝试使用以下几点澄清:

1)在<Context reloadable=true...目录中使用catalina.home/conf,您可以确保在任何班级更改时重新加载您的webapp。您可以在<WatchedResources>元素中添加资源更改监视列表。

2)但是这将重新加载上下文,重新初始化类加载器,清空它的缓存,一切都将像web应用程序刚刚开始一样。

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

1)您交换了类的字节代码,但有一些限制 2)当&#34; loadClass()&#34;时,JVM将返回该类。被称为该类加载器。

这是java检测。您可以编写自己的代理,可以在开始时或在飞行中挂接到JVM。但是,您无法定义新方法,也无法更改静态变量。这些是JVM本机限制(对于Oracle HotSpot JVM,我知道)。您可以使用其他JVM,例如DCEVM没有这样的限制。因此,您可以自己决定如何处理问题。如果你知道自己在做什么(!),你就可以逐个替换课程。您甚至可以定义一个&#34;全新类&#34;,在现有/已加载的类中引用该类对象/方法,并对其进行检测以获取更改。

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