2

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

对于 Mojarra 启动的每个战争模块,它似乎都在尝试扫描其他战争的注释。类加载器无法使用其他战争,因此我遇到了很多异常。无论如何它最终都会启动,但它会在我的日志中出现警告,我猜如果没有这个(+100 秒),应用程序启动时间可能会少得多。

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

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

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

我在升级到 Glassfish 3.1(以及 Mojarra 2.1)时看到了这一点。

4

1 回答 1

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 的堆栈跟踪,它已经不那么冗长了。

于 2011-03-18T13:05:48.533 回答