为什么我们需要重新启动一个tomcat服务器,每当一个类文件被改变时,有没有别的办法?更改类文件时重新启动tomcat?
回答
您可以配置Tomcat,让你的web应用“重新加载”。为此,请将reloadable=true
添加到Web应用程序的<Context>
元素中。关于reloadable
属性,则documentation说:
设置为
true
如果你想卡塔利娜监测/WEB-INF/classes/
和/WEB-INF/lib
更改类,并自动如果检测到变化重新加载Web应用程序。此功能在应用程序开发过程中非常有用,但它需要大量的运行时间开销,不建议用于已部署的生产应用程序。这就是为什么该属性的默认设置为false。但是,您可以使用Manager Web应用程序触发按需重新部署已部署的应用程序。
*叹*给我的投票给帕斯卡尔,他是更有用和全面的答案。看着他,似乎开发模式只检查JSP中的变化,这不是OP询问的内容。 – 2009-12-09 13:43:50
当然是有!以开发模式启动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默认检查的文件之一。
我可能是错的,但这似乎取自* Jasper 2 JSP Engine How To *(http://tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html)并且适用于JSP,而不是类。 – 2009-12-09 13:46:22
呐,你照例是正确的;) – 2009-12-09 17:10:28
如果您使用WAR文件进行部署,就可以在Tomcat的配置,这将导致Tomcat的观看Web应用程序根(“web应用”默认情况下)为新的或变更WAR文件设置autoDeploy=true
。如果找到这样的文件,它会自动部署。
帕斯卡Thivent说,虽然,你可以使用Tomcat管理器应用程序(/经理/ HTML)的启动,停止,部署和取消部署的具体应用。如果您正在更改的文件位于特定应用程序中,则这是让Tomcat识别更改的好方法。
如果你开发,你的IDE应该能够透明地做到这一点适当的服务器上。例如。 Eclipse中的Dynamic Web Project知道如何与Tomcat交谈。
如果部署,然后创建WAR-文件和部署这些。 Tomcat知道如何重新部署WAR文件。
退房JRebel。
在更一般的说明中,您必须这样做的原因是因为在Java中,当类加载器加载类时,无法卸载它。 Tomcat需要做的是使用新的类加载器并重新加载所需的所有类。
除了在server.conf中设置autoDeploy = true之外,还应该注意不要在共享类加载器中放置任何类。由共享类加载器加载的类不能重新加载。
您可以使用工具JRebel。请参阅我的博客http://przemek-nowak.pl/2010/10/jrebel-czyli-jak-przyspieszyc-prace-programisty/上的示例。关于Tomcat 6.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没有这样的限制。所以这取决于你如何处理你的问题。如果你知道你在做什么(!),你可以逐个替换类。你甚至可以定义一个“全新的类”,在现有的/加载的类中引用类对象/方法,并用它来检索变化。
我希望这会有所帮助。这里的所有答案都是你做出决定所需要的。
- 1. 从Tomcat重新启动Tomcat
- 2. os时区更改tomcat需要重启
- 3. 如何在文件更改时让ASP.NET重新启动?
- 4. 在不重新启动Tomcat的情况下识别属性文件更改
- 5. Tomcat/Spring - 重新启动Webapp
- 6. Tomcat需要重新启动以采用Jasper Reports更改
- 7. Tomcat 7:当更改context.xml时避免自动重启
- 8. Tomcat服务器 - 方法签名更改时需要重新启动
- 9. 与其他用户重新启动时启动Tomcat
- 10. 重新启动春季开机的时候输入文本文件的更改
- 11. nodemon - 重新启动对json文件的更改
- 12. 更改crontab文件后重新启动cron?
- 13. 重新启动文件上的IIS已更改
- 14. 文件更改后重新启动WingIDE调试器
- 15. 反馈请求 - 重新启动文件更改的Docker容器
- 16. Tomcat的变化javascript文件无需重新启动服务器
- 17. Tomcat 8需要在编辑文件后重新启动
- 18. 如何修改(.NET)时重新启动app/reread app.config文件?
- 19. 是否需要在更新JDK后重新启动Tomcat?
- 20. Tomcat不更新,直到我重新启动Eclipse
- 21. 当上传新war文件时需要重启Tomcat 2次
- 22. 活动重新启动时,电话查看模式更改
- 23. 查看模式更改时活动重新启动
- 24. 方向更改时活动不断重新启动
- 25. 字体更改时停止活动重新启动
- 26. Eclipse活动在代码更改时不重新启动
- 27. Django的:重新启动共享服务器时更改MVC Python文件
- 28. 从Jenkins或网站重新启动Tomcat
- 29. 从网站上重新启动tomcat
- 30. 不得不重新启动tomcat
我也注意到了这个问题。做这件事的一个痛苦的方法是改变你的web.xml两次:一次到一些随机的HelloWorld类,然后回到你改变的类。很高兴我在这里得到了答案。 – theindigamer 2014-08-24 05:40:45
这个问题是因为你想保持最低生产停机时间?那么tomcat的设置不会对你有所帮助。它已经在官方文档中描述过了。 – ha9u63ar 2018-01-10 20:49:50