gpt4 book ai didi

java - 应用程序中两个模块中的重复类 - 实例化类将引用哪个类?

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

有一个 Web 应用程序的 EAR(myApp.ear),其中有两个模块 - 一个 Web 模块 (myWeb.war) 和一个 EJB 模块 ( myModel.jar)。现在,同一个包 myPackage 中的两个模块中都存在一个 myDuplicate.class 类。两个模块中该类的实现是不同的。

如果 Web 模块中的类创建 myDuplicate 类的对象,则该对象将来自 myWeb 中的对象或 myModel 中的对象

这取决于服务器的类加载机制吗?如果是,OC4J 服务器配置中是否有参数来控制此类加载?如果不是,那么是什么控制它?

<小时/>

上面的内容可能看起来太笼统,但这是我面临的一个实际问题。在不同的环境中,正在加载不同的类,但我无法找出控制它的因素。我尝试搜索并找到类加载器,这可能就是答案。但即使在那之后我也无法找到如何控制它在两种环境中以一致的方式运行。

如果有任何不清楚的地方,请分享不清楚的内容,我会尽力澄清。

最佳答案

Java EE 兼容的应用程序服务器中的类可见性有非常明确的规则。

总之(在没有任何明显的类路径条目、外部库或 RAR 文件的情况下),EAR 文件中的模块定义如下:

  • 每个 Web 模块都包含 WEB-INF/classes 的内容以及 WEB-INF/lib 目录中的所有 jar
  • 每个 ejb 模块都是独立的
  • EAR/lib 目录的内容被视为类可见性的单个模块。

鉴于上述情况:

  • Web 模块是隔离的,无法看到彼此的类,但它们可以看到 EAR/lib 类。他们通常也可以看到 ejb 模块,但这不是必需的。兼容的应用程序将使用 list 类路径条目来解决此问题。
  • ejb 模块可以看到它们自己指定的客户端 jar 类和 EAR/lib 类。他们通常也可以看到其他 ejb 模块,但这不是必需的。兼容的应用程序将使用 list 类路径条目来解决此问题。
  • EAR/lib目录下的jar只能看到彼此的类

因此,希望这能让您清楚地了解不同组件之间的类可见性。但是,您仍然需要清楚地了解类加载顺序:

  • 在查看其他类加载器之前,始终会使用 Web 模块自己的类。
  • “父级优先”类加载适用于其他任何地方。

在您的特定情况下,将创建来自 myWebmyDuplicate。只要您不尝试将 myDuplicate 实例传递到 myModel 中,您应该没问题。这可能会导致类加载问题。

当开发人员将 log4j(或其他一些日志库)捆绑到他们的 EAR 文件和 Web 模块中时,我经常看到这种问题,从而导致大量的类加载问题。

请参阅 Java™ 平台企业版 (Java EE) 规范 v6§EE.8.2 库支持,了解更多详细信息。

关于java - 应用程序中两个模块中的重复类 - 实例化类将引用哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26848177/

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