1

我打包了一个 EAR (myear.ear) 文件并将其部署在 JBoss EAP 6(即 JBoss 7 :))中。它看起来像这样:

lib/ 
  my-common.jar (Custom library containing common classes used by both the WAR and BIZ)
  --- (other libraries used by both WAR and BIZ) ---
META-INF/
    jboss-deployment-structure.xml (specifies just <ear-subdeployments-isolated>false</ear-subdeployments-isolated> )
my-biz.jar (EJB Module)
    META-INF/
        beans.xml
        MANIFEST.MF
    -- java classes -- 
my-war.war (WAR Module)
    WEB-INF/
        beans.xml
        lib/ (empty! I made a skinny war)
    META-INF/
        MANIFEST.MF
    resources/
    -- java classes --

其中my-war.war有一个类从my-common.jar. 这是发生的事情:

public class MyWarMember implements Serializable{//my-war.war

  public void foo(){
    MyCommonMember.deepCopy(this);
  }
}
---------------------------------------------------------------------
public class MyCommonMember{//my-common.jar
  public static Object deepCopy(Serializable obj){

    ObjectOutputStream oos .....
    ...
    oos.writeObject(obj);
    ....
    ObjectInputStream ois ....;
    ....
    ois.readObject(); 
  }
}

调用ois.readObject();将为 MyWarMember 抛出 ClassNotFoundException:

java.lang.ClassNotFoundException: my.war.MyWarMember from [Module "deployment.myear.ear:main" from Service Module Loader]

你会如何解决这个问题?谢谢!

4

2 回答 2

1

您已经在您的my-war.war和您的公用 jar之间创建了一个循环依赖关系my-common.jar

  1. MyWarMember你调用

    MyCommonMember.deepCopy(this);- 这会起作用,因为你已经在你的库中添加了 jar

  2. MyCommomMember你做

    public static Object deepCopy(Serializable obj){- 类未找到异常,因为它不知道您MyWarMembermy-war.war.

解决方案: 移除你的循环依赖。

希望能帮助到你。

于 2012-11-15T11:15:02.753 回答
0

这可能是多个隔离类加载器的问题。从异常中,它抱怨有问题的地方是deployment.myear.ear:main看不到MyWarMember。这可能是因为 war 模块不在 EAR 的 lib 文件夹中。

注意:存在间接循环依赖,my-war.war使用my-common.jar哪个处理无类型类,my-war.war但为了序列化,它需要知道实际类型。

于 2012-11-15T10:30:10.567 回答