1

我有两个 EAR,EAR A 是实际应用程序,EAR B 用于调试和测试。

EAR A 包含一个带有所有 Seam 组件类的 JAR A,用 @Name 注释。EAR A 包含一个 WAR A,它是 Seam 2.3 webapp,并在 components.xml 中定义了所有组件。这工作正常。

EAR B 包含另一个 WAR B,它是来自 EAR A 的 WAR A 的剥离版本。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 条件为假。但是当我在调试器中检查 clazz 的注释时,我可以看到我的注释具有正确的值。

interface org.jboss.seam.annotations.Name=@org.jboss.seam.annotations.Name(value=org.jboss.seam.security.identity)

我怀疑这与在两个不同的部署(即类加载器)中加载 @Name 注释有关,因为当我将 WAR B 移动到 EAR A 时,一切正常。请让我知道我是否正确,或者是否有办法实现这一目标。

4

1 回答 1

1

我认为问题是由于您在两个 WAR 中都有库这一事实引起的jboss-seam.jar,这会产生类加载冲突,因为@Name注释是在两个类加载器中定义的,而isAnnotationPresent(Name.class)失败是因为该类确实没有WARB:Name.class,而是WARA:Name.class.

要解决此问题,请移至jboss-seam.jar共同的祖先类加载器:

  1. 移动jboss-seam.jar到服务器的 lib 目录。
  2. jboss-seam.jarEAR 库和两个 WAR 放在同一个 EAR 中。
  3. 或者,删除两个 EAR 之间的依赖关系,将共享 JAR 打包到两个 EAR 中。
  4. 最后,您可以通过 EJB 调用 EAR A 中的服务,以“EE 方式”建立依赖关系。

在 JBoss 7 中,有一种在 EAR 之间共享模块的方法,您也可以探索该解决方案(但这不是 EE 标准行为,因此它不能移植到其他容器)。在jboss-deployment-structure.xmlEAR B 中声明依赖模块:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
  <deployment>
    <dependencies>
      <module name="EAR_A.ear.JAR_A.jar" export="true" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

但是,我不知道这是否值得,在两个 EAR 中复制依赖项会更容易。

另外,请注意,如果您的组件src/hot处于调试模式,则无论您使用的是什么类加载,从单独的 WAR 中使用它们都会遇到问题(其中的组件src/hot存在于 Seam 在部署应用程序时创建的单独的类加载器中,所以服务器对这些类一无所知)。

于 2013-05-23T15:33:49.020 回答