当前位置: 首页 > 面试题库 >

从.war文件加载类的顺序

昝卓
2023-03-14
问题内容

我在以下情况下有一个关于保证的问题(请注意,问题不是 “如何以其他方式做到这一点?”
,实际上是关于以下情况下的类加载顺序)更好地了解类加载的工作原理)。

这是一个假设的场景…一个 .war 文件具有以下(部分)目录结构:

 WEB-INF/classes/com/acme/Bunny.class
 .
 .
 .
 WEB-INF/lib/acme.jar

两个 Bunny.class 文件均已导入,并引用了 acme.jar中的 其他类。 __

Bunny.classWEB-INF /班/ … 是具有相同的名称/路径,从一类唯一的类 acme.jar

的.jar 文件 acme.jar 还包含 com.acme.Bunny (也有使用没有特殊的类装载器的技巧)。

我了解Java规范保证在程序实际使用(或故意“手动加载”类)该类之前,不会加载该类,这就是为什么如果您将数千个.jar放入一个.war,类加载器不会开始加载数万个类。

(编辑)

但是,上面示例中的两个类的加载顺序如何?

应该这样写:

但是,如何确定要加载上述两个类中的哪一个呢?

或类似的东西 :)

有一个保证: com.acme.Bunny 应该在 com.acme …的 任何其他类之前使用。

基本上,在Wikipedia上编写了以下内容:

最复杂的JAR地狱问题是在利用类加载系统的全部复杂性的情况下出现的。Java程序不需要仅使用单个“平面”类加载器,而是可以由几个(实际上是无限数量的)嵌套的协作类加载器组成。由不同的类加载器加载的类可能以开发人员无法完全理解的复杂方式交互,从而导致莫名其妙的错误或错误。

所以我想知道:我可以确定 /classes/com/acme/Bunny.class 是否会在 WEB-INF / lib / 目录中的
.jar文件 之前被类加载? __


问题答案:

该答案不正确,但是不能删除,因为它是可接受的答案。请参阅下面的@Sajeev答案。



 类似资料:
  • 我收到了一些java代码和一个需要测试的web应用程序的WAR文件。 所以总的来说,我的问题是1将war和源代码加载到Eclipse2中的正确过程是什么。为什么Eclipse没有加载war文件

  • 如果我有artifactId、groupId和版本,我如何配置pom.xml,maven将从nexus存储库下载test.war文件。我假设这应该发生在 在执行块中。我已经试过了,但没有运气:

  • 我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?

  • 我对maven的类加载顺序有一个问题。 我知道,自maven版本2.0.9以来,类加载一直是确定性的,并且在pom中使用顺序。我不清楚传递依赖关系。maven是否首先加载所有顶级依赖项,然后加载传递依赖项。或者加载具有所有传递依赖项的顶级依赖项,然后加载下一个顶级依赖项。 我知道在完全正确的maven设置中,顺序没有问题,但我在依赖项中有一些重复的类,我想知道使用哪一个。排除可传递依赖项是没有选择

  • 问题内容: 我需要从罐子中加载属性文件。该罐子包含在war文件中。这是结构 现在,我在一个servlet中编写了以下代码,如下所示: 但是上面的代码我得到流为空。如果我将属性文件放在ROOT.war / WEB- INF中,则可以正常工作。我有一个不错的主意,如果getResourceAsStream中的路径以“ /”开头,那么它将在上下文根目录中搜索资源。但是,如何读取位于jar的资源,该jar

  • 我有一个应用程序加载它的Spring上下文与XML配置。 上下文文件存储在jar的类路径中(在目录中)。 通过引入一个新bean,我想从同一存档的类路径中加载一个beanio映射文件。由于Tomcat在Eclipse中运行,这一切都很有吸引力,但当我将WAR文件部署到QA环境时,应用程序无法启动。 让我走代码: 然后是背景 然后呢?嗯...我已经通过首先解压war文件来双重检查构建的jar文件。都