3

我的 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 的类为 WAR 成员抛出 ClassNotFoundException ”,但答案说这是一个“循环依赖”问题。但是,我在这里看不到任何“循环依赖”问题。在java中,任何ClassX都可以引用ClassY,即使ClassY引用ClassX....

4

1 回答 1

3

helper.jar你不能简单地加载一个位于你war1.warusing中的类Class.forName

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

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

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

这可以使用以下方法完成:

Class.forName("war1Class.class",true,Thread.currentThread().getContextClassLoader())
于 2013-04-10T09:28:15.507 回答