为什么我们需要在更改类文件时重新启动tomcat服务器,是否有其他办法?
答案 0 :(得分:29)
您可以配置Tomcat并使您的webapp“可重新加载”。为此,请将reloadable=true
添加到您的网络应用的<Context>
元素中。关于reloadable
属性,documentation说:
如果您希望Catalina监视
true
和/WEB-INF/classes/
中的类以进行更改,则设置为/WEB-INF/lib
,并在检测到更改时自动重新加载Web应用程序。此功能在应用程序开发期间非常有用,但它需要大量的运行时开销,不建议在已部署的生产应用程序上使用。这就是为什么此属性的默认设置为false。但是,您可以使用Manager Web应用程序按需触发已部署应用程序的重新加载。
答案 1 :(得分:7)
来自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;,在现有/已加载的类中引用该类对象/方法,并对其进行检测以获取更改。
我希望这会有所帮助。这里的所有答案都是您做出决定所需要的。