我有一个在 Glassfish 3.1.2 中运行的 Spring webapp。我刚刚开始将 webapp 转换为 OSGi。我取消部署现有的 webapp,并将 spring 和 gemini OSGi jar 复制到 Glassfish 安装中的 modules 目录中。然后我使用 Glassfish OSGi Web 控制台(我理解为某种定制的 Felix Web 控制台)安装并激活了它们,一切都很好。它什么也没做,但我可以在我想要测试的 Web 控制台中安装和激活它们。
然后,我开始使用 Glassfish 应用程序控制台重新部署现有 web 应用程序的非 OSGi jar,以查看这两种类型的 jar 是否可以共存,鉴于我对 OSGi 的理解,我认为它们应该能够共存。此时NoClassDefFoundErrors
开始抱怨无法org.apache.commons.logging
在其他类中找到。这些类作为已安装的 OSGi jar 存在于 Module 目录和应用程序类路径中。然后,我在控制台中停用了 jar,但没有删除 OSGi jar,但继续抛出异常。
我打印了一个类加载器,发现WEB-INF
我的 web 应用程序中的 jar 没有被加载,但我不确定这是问题还是症状。
然后,我从已卸载的 OSGi jar 中删除了这些 jar,一切都重新开始工作,并且可以部署 webapp。
谁能想到为什么会发生这种情况?我猜模块目录的内容在类路径上,但如果是这样,为什么?如果我希望 OSGi 和非 OSGi jar 一起工作,我将如何防止这引起问题?
旁注
- 当我查看类加载器加载的类时,我看不到模块文件夹中的内容正在加载。
- 我可以在部署非 OSGi jar 后安装和激活 OSGi jar,但反之则不行。