我们有一个庞大的EAR应用程序,包含大约20个ejb-jar和war模块。
对于Mojarra开始的每个战争模块,似乎它试图在每次其他战争中扫描注释。其他战争对于类加载器是不可用的,所以我有很多例外。无论如何它最终都会启动,但是它会在警告的情况下使我的日志变得混乱,如果没有这个(+100秒),我猜应用程序的启动时间会少得多。
为清楚起见,我有以下结构:
EAR
+- ejb1
+- ejb2
+- war1
+- war2
当Mojarra启动war1时,它会抱怨war2中缺少类(ClassNotFoundException)。
我在升级到Glassfish 3.1时看到了这一点(因此,Mojarra 2.1)。
答案 0 :(得分:4)
我找到了原因,并找到了一些解决方法。
在与Mojarra 2.1一起提供的Glassfish 3.1上,类路径扫描被委托给Glassfish。现在,Glassfish似乎给了所有类别的耳朵文件而不是战争。我为此打开了http://java.net/jira/browse/JAVASERVERFACES-1995(但它似乎是一个Glassfish错误,而不是JSF / Mojarra)。
在等待修复的同时,我修补了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的堆栈跟踪,这已经非常简洁了。