我在Glassfish 3.1.2中运行了一个Spring webapp。我刚刚开始将webapp转换为OSGi。我取消部署现有的webapp并将spring和gemini OSGi jar复制到Glassfish安装的modules目录中。然后我使用Glassfish OSGi Web控制台(我理解为某种自定义的Felix Web控制台)安装并激活它们,一切都很好。它没有做任何事情,但我可以在Web控制台中安装和激活它,这是我想要测试的。
然后我开始使用Glassfish应用程序控制台重新部署我现有webapp的非OSGi 罐子,看看这两种罐子是否可以共存,鉴于我对OSGi的理解,我认为他们认为应该可以。此时NoClassDefFoundErrors
开始被抛出抱怨无法在其他课程中找到org.apache.commons.logging
。这些类在Module目录中作为已安装的OSGi jar和应用程序类路径存在。然后我在控制台中停用了jar,但没有移除OSGi jar,但是异常继续被抛出。
我打印出一个类加载器,发现我的webapp的WEB-INF
中的jar没有加载,但我不确定这是问题还是症状。
然后我从已卸载的OSGi jar中删除了jar,一切都开始工作了,可以部署webapp。
任何人都可以想到为什么会发生这种情况的原因吗?我猜测模块目录的内容是在类路径上,但如果是这样,为什么呢?如果我想让OSGi和非OSGi罐子一起工作,我怎么能防止这个问题?
附注
答案 0 :(得分:1)
(免责声明:我没有玻璃鱼的具体经验,但JBoss和其他人 奇怪的环境体育类加载器层次结构)
你必须小心java中的类加载器层次结构 - 如果来自另一个类加载器,相同的字节码相等的类将不相等或不可加载,并且在加载类时,通过加载类加载器或其父类来找到依赖项是很重要的。 / p>
要解决您的情况,您必须仔细检查此层次结构并检查委派和类解析的设置(如父级优先/自我优先)。
JBoss尝试通过引入统一的类加载器来解决这个问题,这导致了一大堆各种类和默认设置中的上下文/ webapps之间的资源泄漏。