gpt4 book ai didi

java - 当我在模块文件夹中有 jar 时,Webapp 没有部署在 glassfish 中

转载 作者:行者123 更新时间:2023-11-30 11:39:46 25 4
gpt4 key购买 nike

我有一个在 Glassfish 3.1.2 中运行的 Spring webapp。我刚刚开始将 webapp 转换为 OSGi。我取消部署现有的 webapp,并将 spring 和 gemini OSGi jar 复制到 Glassfish 安装的模块目录中。然后,我使用 Glassfish OSGi Web 控制台(据我所知是某种定制的 Felix Web 控制台)安装并激活了它们,一切都很好。它什么也没做,但我可以在 Web 控制台中安装和激活它们,这正是我想要测试的。

然后我开始使用 Glassfish 应用程序控制台重新部署现有 Web 应用程序的 非 OSGi jar,以查看这两种类型的 jar 是否可以共存,根据我对 OSGi 的理解,我认为它们应该可以。此时 NoClassDefFoundErrors 开始提示无法在其他类中找到 org.apache.commons.logging。这些类作为已安装的 OSGi jar 存在于 Module 目录和应用程序类路径中。然后我停用了控制台中的 jar ,但没有删除 OSGi jar ,但异常继续被抛出。

我打印了一个类加载器,发现我的 web 应用程序的 WEB-INF 中的 jar 没有加载,但我不确定这是问题还是症状。

然后我从卸载的 OSGi jar 中删除了 jar,一切都重新开始工作,并且可以部署 webapp。

谁能想出这可能发生的任何原因?我猜测模块目录的内容在类路径中,但如果是这样,为什么呢?如果我希望 OSGi 和非 OSGi jar 一起工作,我该如何防止这导致问题?

边注

  • 当我查看类加载器加载的类时,我看不到正在加载的模块文件夹中的内容。
  • 我可以在部署非 OSGi jar 之后安装并激活 OSGi jar,反之则不行。

最佳答案

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

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

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

JBoss 试图通过引入统一的类加载器来解决这个问题,这导致在默认设置下上下文/web 应用程序之间出现一大堆各种各样的类和资源泄漏。

关于java - 当我在模块文件夹中有 jar 时,Webapp 没有部署在 glassfish 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com