weblogic 10.3.5.0 の richfaces 4.3.1 で問題が発生しました。デプロイ時に次の例外が発生します。
java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! duplicate key: class javax.faces.validator.LongRangeValidator
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:290)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:481)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
Truncated. see log file for complete stacktrace
Caused By: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! duplicate key: class javax.faces.validator.LongRangeValidator
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:351)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:222)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:481)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
Truncated. see log file for complete stacktrace
Caused By: java.lang.IllegalArgumentException: duplicate key: class javax.faces.validator.LongRangeValidator
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:72)
at com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:245)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:231)
at org.richfaces.javascript.ClientServiceConfigParser.parseConfig(ClientServiceConfigParser.java:53)
ClientServiceConfigParser の内部を調べてデバッグしたところ、richfaces-components-ui-4.3.1.Final.jar から /META-INF/csv.xml を 2 回読み込んでいることがわかりました。
問題の方法は次のとおりです。
public static Map<Class<?>, LibraryFunction> parseConfig(String name) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (null == loader) {
loader = ClientServiceConfigParser.class.getClassLoader();
}
Builder<Class<?>, LibraryFunction> resultBuilder = ImmutableMap.builder();
try {
Enumeration<URL> resources = loader.getResources(name);
while (resources.hasMoreElements()) {
URL url = (URL) resources.nextElement();
resultBuilder.putAll(parse(loader, url));
}
} catch (IOException e) {
return Collections.emptyMap();
}
return resultBuilder.build();
}
Weblogic の ChangeAwareClassLoader ( weblogic.utils.classloaders.ChangeAwareClassLoader
) と関係があるようです。内部org.richfaces.javascript.ClientServiceConfigParser.parseConfig(String)
で実行すると、たまたま同じリソースの 2 つのコピーがClassLoader loader = Thread.currentThread().getContextClassLoader();
返されるためです。ChangeAwareClassLoader
ただし、ローダーを (デバッガーを使用して) null にして実行loader = ClientServiceConfigParser.class.getClassLoader();
すると、別のクラスローダー: になりweblogic.utils.classloaders.GenericClassLoader
ます。同じリソースの 2 つのコピーを取得しません。
価値があるのは、私がmavenを使用していて、次のようにリッチフェイスにロードしたことです。
<dependency>
<groupId>org.richfaces.ui</groupId>
<artifactId>richfaces-components-ui</artifactId>
</dependency>
<dependency>
<groupId>org.richfaces.core</groupId>
<artifactId>richfaces-core-impl</artifactId>
</dependency>
私が間違った Maven 依存関係をロードしたと人々が言う前に、IllegalArgumentException: duplicate key (JSF)とは関係がないことをお伝えできます。
loader.getResources(name);
デバッガーを使用して、まったく同じリソースが返されることを確認したためです。
zip:C:/bea/user_projects/domains/test/servers/AdminServer/tmp/_WL_user/_appsdir_umsWebUI-jee-ear-1.0-SNAPSHOT_ear/6m7brt/lib/richfaces-components-ui-4.3.1.Final.jar!/META-INF/csv.xml
zip:C:/bea/user_projects/domains/test/servers/AdminServer/tmp/_WL_user/_appsdir_umsWebUI-jee-ear-1.0-SNAPSHOT_ear/6m7brt/lib/richfaces-components-ui-4.3.1.Final.jar!/META-INF/csv.xml
また、参考までに、JSF フォーラムを試してみて、weblogic フォーラムに投稿しただけですが、ここでより良い応答が得られるかもしれないと考えました。他の 2 つの投稿は次のとおりです。
https://forums.oracle.com/forums/thread.jspa?threadID=2529414 https://community.jboss.org/thread/224100
リッチフェイスの私自身のバージョンをコンパイルする以外に、回避策のアイデアを持っている人はいますか? ChangeAwareClassLoader
多分を無効にする方法は?そのクラスローダーを無効にしようとしても、私の Google 検索では何も結果が得られませんでした。