【问题标题】:EAR lib's class throwing a ClassNotFoundException for a WAR memberEAR lib 的类为 WAR 成员抛出 ClassNotFoundException
【发布时间】:2013-06-28 13:02:21
【问题描述】:

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

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

【问题讨论】:

  • 您列出的代码中存在一些混淆,MyWarMember 方法foo 调用MyCommonClass.deepCopy,但下面的行显示deepCopyMyCommonMember 的方法班级。此外,您说在MyCommonMember.deepCopy 中发生的对ois.readObject 的调用会为MyWarMember 抛出ClassNotFoundException,这似乎在同一个包中。你能更好地解释问题出在哪里吗?
  • @remigio 你说得对,我太快了。我更新了问题,希望现在清楚了。。
  • 您的my-common.jar 需要使用任何库吗?
  • 我不明白对ObjectInputStream.readObject 的调用如何引发MyWarMember 类的异常,也许您将结果分配给该类的对象?
  • @Quincy 是的,my-common.jar 对外部库有几个依赖项

标签: java jboss classloader classnotfoundexception


【解决方案1】:

您已在您的 my-war.war 和您的公共 jar my-common.jar 之间创建了一个循环依赖项。

  1. 来自MyWarMember 你正在调用

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

  2. 来自MyCommomMember你正在做的事情

    public static Object deepCopy(Serializable obj){ - Class not found 异常,因为它不知道您在 my-war.war 中的 MyWarMember

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多