【问题标题】:EAR lib's class throwing a ClassNotFoundException for a WAR member (different)EAR lib 的类为 WAR 成员抛出 ClassNotFoundException(不同)
【发布时间】:2013-04-02 00:52:36
【问题描述】:

我的 EAR 结构如下:

lib/ 
  helper.jar (Helper classes used both by war1.war and war2.war)
war1.war
    WEB-INF/
        lib/
            entities1.jar
war2.war
    WEB-INF/
        lib/
            entities2.jar

当 war1 在 helper.jar 中调用一个本身调用 Class.forName("a class in war1") 的类时,它会抛出 ClassNotFoundException

请注意,当战争类加载 ear/lib 类时,人们通常会遇到 ClassNotFoundException。 我的情况正好相反。

我的 EAR 部署在 Glassfish 3.1.2 中。

我见过类似的案例,但是在 JBoss 中,“EAR lib's class throwing a ClassNotFoundException for a WAR member”,但答案说这是一个“循环依赖”问题。但是,我在这里看不到任何“循环依赖”问题。在java中,任何ClassX都可以引用ClassY,即使ClassY引用ClassX....

【问题讨论】:

    标签: java jar glassfish war ear


    【解决方案1】:

    helper.jar 中,您不能简单地使用Class.forName 加载位于war1.war 中的类。

    限制来自Class.forName 方法使用的默认类加载器,它是企业应用程序的类加载器(加载helper.jar 的类加载器),它只知道它的父母,而不知道它的孩子(war1.war 和@987654327 @类加载器)。

    您的问题的解决方案是明确使用 context 类加载器,它按顺序扫描:

    战争->耳朵->系统->扩展->引导

    这可以使用:

    Class.forName("war1Class.class",true,Thread.currentThread().getContextClassLoader())
    

    【讨论】:

    • 非常感谢您的解决方案和解释。 有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多