EAR lib的类为WAR成员抛出ClassNotFoundException

时间:2012-11-14 21:01:20

标签: java jboss classloader classnotfoundexception

我打包了一个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]

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

2 个答案:

答案 0 :(得分:1)

您已在my-war.war和公共广告my-common.jar之间创建了循环依赖关系。

  1. MyWarMember开始调用

    MyCommonMember.deepCopy(this); - 这会有效,因为你已经在你的lib中添加了jar

  2. MyCommomMember开始

    public static Object deepCopy(Serializable obj){ - 未找到类的例外,因为它不知道MyWarMember中的my-war.war

  3. <强>解决方案: 删除循环依赖。

    希望它有所帮助。

答案 1 :(得分:0)

这可能是多个孤立的类加载器的问题。从例外情况来看,它抱怨有问题的地方deployment.myear.ear:main没有看到MyWarMember。这可能是,因为war模块不在EAR的lib文件夹中。

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