在工作中,我们遇到了" PermGen内存不足 "异常的问题,团队领导决定它是JVM中的一个错误 - 与代码的热部署有关.在没有解释许多细节的情况下,他指出热部署是一个"难题",即使.NET还没有这么做也很难.
我从鸟瞰图中发现了很多解释热部署的文章,但总是缺乏技术细节.有人能指出我的技术解释,并解释为什么热部署是"一个难题"?
"热代码替换失败 - 添加方法未实现".每次我在测试类中更改某些内容(并保存)时,我都会收到此错误消息.无法弄清楚它意味着什么.有人可以帮忙吗?
我已经通过热部署教程,它的工作原理.但我对这些限制有疑问(第3点)即
热部署仅支持方法实现中的代码更改.如果添加新类或新方法,仍需要重新启动.
基本上,如果我在现有方法中进行更改,但在添加方法或类的情况下需要,我们不需要重新启动服务器.
我理解它是如何工作的: -当我在现有方法中进行更改或引入新方法时,Eclipse会将文件放在webserver下的正确位置.如果类已经由perm gen空间中的类加载器加载,它将从permgen空间卸载它并在内部加载新的,而不重新启动服务器,以便反映新的更改(字节代码).那是对的吗 ?
如果是,为什么热部署不适用于新方法和新类文件?
我正在开发一个Liferay portlet,我无法忍受等待Maven构建.war文件,然后将.war复制到LifeRay的自动部署目录,最后等待(再次)直到LifeRay完成部署.这就是为什么我要构建,启动Tomcat(与LifeRay捆绑在一起)并通过Intellij IDEA部署我的portlet,并启用热部署.
我尝试使用IntelliJ中的Running Liferay(来自Liferay Wiki),但无法使其工作.
我也试过以下问题,但没有结果:
环境:
有谁知道怎么做?
我很好奇是否有人知道Grails或Play等框架如何检测代码中的更改并自动触发重新编译而不重新启动应用服务器?Groovy的编译器或其动态性质是否有特定的东西可以轻松实现?
对于后台,我在构建过程中有一个自定义代码生成阶段,我希望能够具有类似的编辑和刷新功能.
提前感谢任何指针,即使我必须筛选代码以获得更大的图片.
编辑:我应该澄清一点,我不打算构建一个Grails插件,以便了解在servlet容器中的任何应用程序中执行此操作所需的内容.即,我使用的是Groovy而不是Grails.
Edit2:听起来Play有一个特定的DEV模式,可以进行热重新加载:http://www.playframework.org/documentation/1.1.1/main#lifecycle
我知道JRebel通过类加载器执行精细的类版本控制,但我假设像Grails或Play这样的Web框架没有将它带到那个级别.
我希望能够将代码更改部署到Tomcat(即将发布),而我正在Eclipse中进行开发.
到目前为止,我有Eclipse的输出,将构建的类放在WEB-INF/classes我的Web应用程序的文件夹中.
我还有一个可重新加载的上下文,web.xml作为一个受监视的资源.任何编辑/保存到这个文件并重新加载我的Web应用程序,他仅用一秒多-比建造新的战争文件,并在充分部署要快得多.
但是,我想要做的是在编辑任何源文件时触发重新部署.由于在Tomcat中修改了.class文件,我似乎只需要监视WEB-INF/classes文件夹及其子项中的任何更改.
我已经读过,我可以在Tomcat中添加额外的监视资源,context.xml但这似乎不是我需要的 - 除非可以指定一个将被监视的目录(包括递归监视子文件夹和文件)?
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/someother.file</WatchedResource>
<Manager pathname=""/>
</Context>
Run Code Online (Sandbox Code Playgroud)
基本上,我的问题是我可以在整个类文件夹(不包括每个WatchedResource显式文件夹)中触发在Tomcat中重新部署吗?
如果没有,touch每当我在该项目中保存源文件时,是否可以将Eclipse配置为web.xml文件?我正在开发Windows系统.:(
PS我对JRebel产品不感兴趣.任何答案都应该是免费解决方案.
更新
根据Tomcat 文档,应该通过将上下文设置为reloadable来监视classes文件夹:
如果您希望Catalina监视/ WEB-INF/classes /和/ WEB-INF/lib中的类以进行更改,则设置为true;如果检测到更改,则自动重新加载Web应用程序.
只有对web.xml的更改才会触发重新加载.这是一个错误还是我的设置不正确?
另外,我已经阅读了有关docBase为给定上下文设置属性的信息:
docBase="webapps/someExample"
Run Code Online (Sandbox Code Playgroud)
这似乎接近我的需要,因为我可以在Eclipse中快速重新发布.我唯一的问题是我需要在同一端口等同时在Tomcat中运行多个web应用程序/ servlet.
由于我从过去几年开始使用Java,我没有看到Oracle为解决类重新加载问题所做的任何努力.就像Jrebel一样
但它的许可版本和成本非常高,非常值得我购买10-20开发者许可证.任何人都知道任何开源或成本较低的许可产品,我可以像JSP或JSF一样用于Java类的热部署,因此我不需要一次又一次地重新启动服务器以进行小型Java类更改.
现在我正在使用Eclipse IDE,是否有像NetBeans这样的其他开源IDE 都有这种内置功能或插件?
我有一个Spring Roo项目,我用它mvn jetty:run来运行我的应用程序.唯一的问题是*.java类的更改不热部署,而*.jspx热部署的更改很好.
那么如何为java类配置mvn jetty到hotdeploy呢?
我想知道是否可以在Tomcat实例中嵌入像Karaf这样的OSGi容器.根据这个问题和其他一些问题,它似乎是可能的,但我似乎无法找到关于如何做到这一点的任何可靠细节或者需要注意的陷阱/警告.
所以:
提前致谢!
我是独立游戏开发者,我目前正在使用NDK为Android平台构建游戏.
我的问题是,这个游戏现在大小超过20MB,并且需要花费大量时间在我的Android设备上进行部署和启动,这正在变得很痛苦,并且正在减慢我的速度.
所以,我想知道
有没有办法热点部署我对我的Android项目进行的增量更改,而不是一次又一次地构建和安装整个东西到我的Android设备?
它甚至可能吗?我正在为Java VM和Java Containers寻找一些像JRebel工具的东西.
[更新:关于缩短构建时间的其他想法,好吗?]
谢谢,干杯!
[注意:只是想提一下,我将无法使用模拟器进行更快的构建,因为我的游戏大量使用OpenGL库,模拟器无法处理.