更改类文件时重启tomcat?

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

您可以配置Tomcat并使您的webapp“可重新加载”。 为此,请将reloadable=true添加到webapp的元素中。 关于reloadable属性, 文档说:

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

肯定有! 在开发模式下启动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默认检查的文件之一。

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

看看JRebel 。

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

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

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

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

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

您可以使用JRebel工具。 请参阅我的博客http://przemek-nowak.pl/2010/10/jrebel-czyli-jak-przyspieszyc-prace-programisty/上的示例。 该示例涉及Tomcat 6.0

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

1)在catalina.home/conf目录中使用 ,可以确保在任何类更改时重新加载webapp。 您可以在元素中添加资源更改监视列表。

2)但是这会重新加载上下文,重新初始化类加载器,清空它的缓存,一切就像webapplication刚刚开始一样。

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

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

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

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