为什么mojarra 2.1会在每个模块启动时扫描所有其他战争?

时间:2011-03-16 14:54:38

标签: jsf java-ee jsf-2 mojarra

我们有一个庞大的EAR应用程序,包含大约20个ejb-jar和war模块。

对于Mojarra开始的每个战争模块,似乎它试图在每次其他战争中扫描注释。其他战争对于类加载器是不可用的,所以我有很多例外。无论如何它最终都会启动,但是它会在警告的情况下使我的日志变得混乱,如果没有这个(+100秒),我猜应​​用程序的启动时间会少得多。

为清楚起见,我有以下结构:

EAR
+- ejb1
+- ejb2
+- war1
+- war2

当Mojarra启动war1时,它会抱怨war2中缺少类(ClassNotFoundException)。

我在升级到Glassfish 3.1时看到了这一点(因此,Mojarra 2.1)。

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的堆栈跟踪,这已经非常简洁了。