为什么Mojarra 2.1在每个模块启动上扫描其他所有战争?
题
我们有大量的耳朵应用,大约有20个EJB-JAR和战争模块。
对于Mojarra开始的每个战争模块,似乎都在试图扫描其他所有战争的注释。其他战争对于Class Loader不可用,因此我得到了很多例外。无论如何,它最终都会开始,但是它会用警告来缩小我的日志,我想没有此启动时间可能会少得多(+100秒)。
为了明确说明,我有以下结构:
EAR
+- ejb1
+- ejb2
+- war1
+- war2
当Mojarra开始WAR1时,它会抱怨WAR2(ClassNotFoundException)中缺少类。
当升级到Glassfish 3.1时,我看到了这一点(因此,Mojarra 2.1)。
解决方案
我找到了原因,还有一些解决方法。
在带有Mojarra 2.1的玻璃鱼3.1上,将类Path扫描委托给Glassfish。现在,玻璃鱼似乎给出了所有类别的耳朵文件而不是战争。我打开了 http://java.net/jira/browse/javaserverfaces-1995 为此(但这似乎确实是玻璃鱼虫,而不是JSF/Mojarra)。
在等待修复时,我像这样修补了莫哈拉:在com.sun.faces.config.configmanager.java中,第834行,我评论了一些行:
// if (provider instanceof DelegatingAnnotationProvider &&
// null != annotationScanner) {
// // This InjectionProvider is capable of annotation scanning *and*
// // injection.
// ((DelegatingAnnotationProvider)provider).setAnnotationScanner(annotationScanner,
// metadataGetter.getJarNames());
// scanUris = Collections.emptySet();
// } else {
// This InjectionProvider is capable of annotation scanning only
scanUris = metadataGetter.getAnnotationScanURIs();
// }
日志现在的详细信息要少得多。似乎Glassfish仍在扫描所有课程,所以我仍然会收到这样的警告:
[#|2011-03-18T13:47:05.019+0100|WARNING|oracle-glassfish3.1|javax.enterprise.system.container.web.org.glassfish.web.loader|_ThreadID=57;_ThreadName=Thread-1;|WEB9052: Unable to load class org.apache.myfaces.custom.inputTextHelp.HtmlTextHelpRenderer, reason: java.lang.ClassNotFoundException: org.apache.myfaces.custom.inputTextHelp.HtmlTextHelpRenderer|#]
但是没有莫哈拉(Mojarra)的stacktrace,它已经少了详细的。
不隶属于 StackOverflow