Mojarra 2.1が各モジュールの起動を他のすべての戦争をスキャンするのはなぜですか?
質問
約20のEJB-jarとWARモジュールを備えた巨大な耳用途があります。
モジャラが開始する各戦争モジュールについて、それは他のすべての戦争で注釈をスキャンしようとしているようです。他の戦争はクラスローダーにとって利用できないので、私は多くの例外を得ています。最終的にはとにかく始まりますが、警告で私のログを覆い隠し、アプリケーションの起動時間はこれなしでははるかに短くなる可能性があると思います(+100秒)。
それを明確にするために、私は次の構造を持っています:
EAR
+- ejb1
+- ejb2
+- war1
+- war2
MojarraがWAR1を開始すると、WAR2(ClassNotFoundException)からクラスが欠落していることに不満を述べます。
Glassfish 3.1(したがって、Mojarra 2.1)にアップグレードするときにこれを見ました。
解決
理由といくつかの回避策を見つけました。
Mojarra 2.1に出荷されるGlassfish 3.1では、ClassPathスキャンがGlassfishに委任されます。現在、Glassfishは戦争の代わりにすべてのクラスの耳ファイルを提供しているようです。私は開きました http://java.net/jira/browse/javaserverfaces-1995 そのため(ただし、JSF/Mojarraではなく、Glassfishのバグのようです)。
修正を待っている間、私はこのようにモハラにパッチを当てました: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|#]
しかし、モハラのスタックトレースはありません。これはすでに冗長性が非常に少ないです。