【问题标题】:Weblogic application classloading of utility jar classes from other jars in the same webappWeblogic 应用程序类加载来自同一 webapp 中其他 jar 的实用程序 jar 类
【发布时间】:2013-08-14 18:10:29
【问题描述】:

我在 Weblogic 中的应用程序中遇到了一些类加载问题。在我的代码中有些地方的类依赖于其他 jar 中的类,我一定遗漏了一些基本的东西。

通过查看我可以找到的信息,如果两个 jar 都在类路径上,这应该不是问题,但这在 Weblogic 上的 Java EE 应用程序上下文中似乎更加微妙。

我有一只耳朵,MyApp.ear

MyApp.ear 包含几个 webapps (war) 和一大堆实用程序 jar 和 EJB。结构是这样的(我不控制它)。

MyApp.ear
     MyWebApp.war
     UtilJar1.jar
     UtilJar2.jar
     etc...

假设 UtilJar1 中有从 UtilJar2 导入类的类。什么 MANIFEST.MF 应该指定两个 jar 都应该在类路径上?耳朵? Webapp 的? UtilJar1 的?

通过反复试验(Weblogic 10.3.2),这似乎工作的唯一方法是在 UtilJar1 的清单类路径中定义 UtilJar2。但我会认为在 webapp 的上下文中,webapp 的类路径将用于该 webapp 中发生的任何类加载?相反,除非在第一个 jar 的类路径中指定第二个 jar,否则我会看到 NoClassDefFound。

【问题讨论】:

    标签: java web-applications weblogic classpath


    【解决方案1】:

    以下是 Oracle 文档的摘录:

    J2EE 规范提供清单 Class-Path 条目作为模块指定它需要类的辅助 JAR 的一种方式。

    如果您将其他支持 JAR 文件作为 EJB JAR 或 WAR 文件的一部分,则仅需要使用此清单 Class-Path 条目。

    请仔细阅读以下文档中的 Manifest Class-Path 部分 -

    Class Loading

    J2ee 部署档案 [EAR] 是不同模块的组合,每个模块在各自的清单文件中声明依赖关系。

    据我了解,EAR 中的每个模块 [war, ejb,jar] 都会有自己的类加载器,它们是 EAR 类加载器的子级。除非您在 Manifest 文件中声明依赖项,否则子类加载器将仅对其父类可见,并且不知道兄弟类加载器。

    即使 WAR 清单中有一个条目,utilit1.jar 不知道utility2.jar,您必须在 Utility1.jar 的 Manifest 文件中明确提及依赖关系。

    【讨论】:

    • 感谢您的回复,我已阅读该文档,但我不清楚。我的 JAR 显式和我的 WAR 隐式需要类路径上的这两个“辅助”jar。我不清楚如果您有 WAR 清单,为什么还需要在 JAR 清单中明确提及另一个 jar。
    • 如果这些实用程序 jar 在 WAR 文件的 /WEB-INF/lib 文件夹中,则无需将它们添加到类路径中。 Web 容器将这些 jars 添加到类路径中。如果 jars 在 war 文件之外,尤其是 EJB,则明确要求在 MANIFEST.MF 中提及 jar 名称
    • 感谢您的评论,正如我在问题中描述的那样,这些罐子在 WAR 之外,它们都在 EAR 内。我已经在 WAR MANIFEST.MF 中声明了它们,问题在于在该上下文中两个实用程序 jar 之间的类加载,尽管 War 的清单类路径条目。此时不涉及 EJB
    • 我已经用我认为最能回答这个问题的细节更新了帖子。如果我错了,请纠正我。
    • 谢谢!我认为我从官方文档中错过的是实用程序 jar(不仅仅是 ejb 模块)也有类加载器,它们是耳朵的孩子,并且是战争类加载器的兄弟。那么,除了 JSP 的特殊情况,war 类加载器似乎没什么用?
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 2017-07-30
    • 2018-11-20
    • 2010-11-23
    • 2015-10-13
    • 2012-02-26
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多