这是我第一次在这里发帖提问,我会尽量让我的问题清楚。
我尝试找到开发Java webapps的最佳流程。经过数月的反复试验,我的Web开发环境由以下部分组成:
框架:Apache Wicket 1.4.16
IDE:eclipse Galileo,m2eclipse插件
构建工具:Maven 2
数据访问:EclipseLink 2.1.1通过JPA 2.0(使用StaticWeave)
RDBMS:使用jTDS的MSSQL 2005或更高版本
DI:Google Guice 2.0
开发Web容器:嵌入Maven Jetty插件的Jetty服务器
目标Web容器:Tomcat 6.x或更高版本
我使用maven Jetty插件测试运行我的webapps,启用JPDA,同时需要行精度跟踪。
每当对源代码进行更改时,我都必须重新加载我的应用才能生效。按ENTER重新加载是好的,但经过几次重新加载(大约3~5取决于我的PermGen设置),抛出OutOfMemoryException,而不是我必须关闭并再次启动我的应用程序。我知道自动重新加载可以通过配置来实现,但它只会导致OOME更快(由于过多的重新加载)。
谷歌搜索后,我意识到存在一些内存泄漏问题。我已经尝试放大MaxPermSize设置,但我的装备上的RAM是有限的,设置为非常大的东西是不合理的。 BTW,内存泄漏检测是在Tomcat 7中引入的,我发现大多数内存泄漏来自jTDS,Google Guice和Wicket本身,但我无能为力。
我能做些什么来加速我的开发过程?为了减少重新加载时间,我应该转移到更高级的Web容器,例如Glassfish(抱歉,我在这里买不起WebLogic或WebSphere。)或任何东西。
提前致谢,欢迎提出任何意见!
答案 0 :(得分:5)
我使用JRebel,它确实有很大帮助。我仍然需要立即重启服务器,但大多数更改都可以正常工作。它非常适合以Wicket为中心的以Java为中心的框架。你也可以尝试DCEVM,如果你有一个'黑客'版本的JDK用于开发。
答案 1 :(得分:0)
我有一个简单的Jetty包装器,用于在eclipse中启动webapp。如果我在调试模式下启动它,那么除非我更改方法签名或字段名称,否则不需要重新加载。不需要重新加载上下文。
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
public static void main(String[] args) {
Properties properties= ...//read properties from text file
Server server = new Server(properties.getPort());
WebAppContext webapp = new WebAppContext(
properties.getWebApplicationPath(), properties.getContextPath());
server.start();
//.... and here can be key capture for stopping Jetty
}
其中properties.getWebApplicationPath()是./WebContent(或者根据您的maven项目结构可能会有所不同)。
在Tomcat中部署时,这不会解决内存泄漏问题,但在开发过程中可能非常有用。 我也在使用Wicket和Guice,我没有注意到内存泄漏。