我有一个在 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,但反之则不行。