2 つの EAR があります。EAR A は実際のアプリケーションで、EAR B はデバッグとテストに使用されます。
EAR A には、@Name で注釈が付けられたすべての Seam コンポーネント クラスを持つ JAR A が含まれます。EAR A には、Seam 2.3 webapp である WAR A が含まれ、components.xml ですべてのコンポーネントを定義します。これはうまくいきます。
EAR B には、EAR A から WAR A を削除した別の WAR B が含まれています。EAR B は、jboss-deployment-structure.xml でサブデプロイメント「JAR A」への依存関係を正しく定義します。WAR B は、JAR A からいくつかのコンポーネントのみを定義しますが、webapp のデプロイ中に初期化に失敗します。これは次の原因で発生します。
java.lang.IllegalArgumentException: Component class must have @Name annotation or name must be specified in components.xml: [name of my class]
初期化をデバッグし、Seam クラス org.jboss.seam.init.Initialization:488 にブレークポイントを設定すると
if ( !clazz.isAnnotationPresent(Name.class) )
{
throw new IllegalArgumentException(
"Component class must have @Name annotation or name must be specified in components.xml: " +
clazz.getName());
}
name = clazz.getAnnotation(Name.class).value();
if 条件が false です。しかし、デバッガーで clazz の注釈を調べると、注釈が正しい値であることがわかります。
interface org.jboss.seam.annotations.Name=@org.jboss.seam.annotations.Name(value=org.jboss.seam.security.identity)
WAR B を EAR A に移動すると、すべてが機能するため、これは 2 つの異なるデプロイメント (つまり、クラスローダー) で @Name アノテーションをロードすることと関係があると思われます。私が正しいかどうか、またはこれを達成する方法があるかどうかを教えてください。