2

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

1 回答 1

1

(免责声明:我没有 glassfish 的具体经验,但 JBoss 和其他奇怪的环境具有类加载器层次结构)

您必须小心 java 中的类加载器层次结构 - 如果来自另一个类加载器,相同的字节码相等类将不相等或不可分配,并且在加载类时,通过加载类加载器或其父项来查找依赖项很重要。

要解决您的情况,您必须仔细检查此层次结构并检查委派和类解析的设置(例如 parent first / self first )。

JBoss 试图通过引入统一的类加载器来解决这个问题,这导致一大堆各种各样的类以及默认设置下上下文/webapps 之间的资源泄漏。

于 2012-11-05T07:51:13.997 回答