我的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(“war1中的一个类”)时,它会抛出 ClassNotFoundException 。
请注意,当war类加载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 ....
答案 0 :(得分:3)
在helper.jar
中,您无法使用war1.war
简单地加载Class.forName
中的班级。
限制来自Class.forName
方法使用的默认类加载器,它是企业应用程序的类加载器(加载helper.jar
的方法),它只知道它的父项,而不知道它的子项({{ 1}}和war1.war
类加载器)。
您的问题的解决方案是明确使用上下文类加载器,它按顺序扫描:
战争 - >耳朵 - > system - >扩展名 - >自举
这可以使用:
完成war2.war