seam能很好地支持 页面(faceslet)、非ejb class,各种page.xml的热部署,完全动态支持这些内容的增加、修改,但不支持删除。其中页面(faceslet)的热部署是有facelets自己管理的,与seam无关。
基本的配置seam官方文档讲解的都很清楚了,这里再简单罗列一下。可以详细查看seam官方文档
1)在components.xml中设置<core:init debug="true">,debug="false"取消热部署
2)将class放到 WEB-INF/dev目录下,默认是放到WEB-INF/class下的。
3)在components.xml中配置热部署filter的url<web:hot-deploy-filter url-pattern="*.seam" />,这样就只对.seam这样的请求进行热部署处理,静态资源不需要热部署,比如.jpg,.css,.js等都不需要热部署。
seam通过filter(HotDeployFilter)进行热部署,每次请求HotDeployFilter都会去扫描WEB-INF/dev下的class、各种xx.components.xml和各种xx.page.xml,如果有增加或修改就清空全部热部署相关的组件和组件实例,然后全部重建这些组件,当请求中用到组件实例时再去构造组件实例,这样会导致请求失效,再次访问就好了。
每次seam请求都会导致扫描全部热部署的资源,当热部署的资源越来越多时会导致大量的无用磁盘扫描,非常影响访问性能。绝大多数时候seam访问都是不需要热部署的,可以让正常的seam访问不走HotDeployFilter,只有当有修改需要热部署时,通过一个访问触发热部署,然后再正常seam访问即可。
这样配置<web:hot-deploy-filter url-pattern="*.seam1" />,需要热部署时就访问下xxx.seam1,页面会报错,但不用管,再次访问xxx.seam即可将修改的内容体现出来。
非热部署的class不能访问热部署的class,反过来则可以。比如不能在jsf验证器中调用热部署的class,因为jsf验证器是由web classloader加载的,web classloader加载不了热部署目录中的class。
可以通过seam组件方式加载,然seam去加载
validator=(IBusinessValidator) Component.forName(getValidatorClassName()).getBeanClass().newInstance();
实体类,ejb目前都不能热部署