gpt4 book ai didi

java - 从 .war 文件加载类的顺序

转载 作者:太空狗 更新时间:2023-10-29 23:03:43 26 4
gpt4 key购买 nike

我有一个关于保证的问题,如果有的话,在下面的场景中(注意问题不是“如何以不同的方式做到这一点?”,这个问题真的关于以下案例中的类加载顺序(以更好地理解类加载的工作原理)。

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

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

两个 Bunny.class 文件都从 acme.jar 导入引用其他类

WEB-INF/classes/... 中的

Bunny.class 是唯一与 acme 中的类具有相同名称/路径的类。 jar

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

我知道 Java 规范保证在程序实际使用(或故意“手动加载类”)之前不会加载类,这就是为什么如果你塞满了数千个 .jar,比如说,在 .war 中,类加载器不会开始加载数万个类。

(编辑)

But what about the order in which the two classes in the examples above are loaded?

应该这样写:

But how is it decided which one of the two classes above is loaded?

或类似的东西:)

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

基本上,在维基百科上,是这样写的:

The most complex JAR hell problems arise in circumstances that take advantage of the full complexity of the classloading system. A Java program is not required to use only a single "flat" classloader, but instead may be composed of several (or, in fact, an indefinite number of) nested, cooperating classloaders. Classes loaded by different classloaders may interact in complex ways not fully comprehended by a developer, leading to inexplicable errors or bugs.

所以我想知道:我能确定 /classes/com/acme/Bunny.class 会在 .jar 之前被加载吗? em>WEB-INF/lib/ 是不是目录?

最佳答案

选择的答案是错误的。 Servlet 规范版本 2.4 和 3.0 明确指出首先加载 WEB-INF/classes,然后加载 WEB-INF/lib

Servlet 2.4:http://download.oracle.com/otn-pub/jcp/servlet-2.4-fr-spec-oth-JSpec/servlet-2_4-fr-spec.pdf - SRV.9.5 节,最后一段

Servlet 3.0:http://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-oth-JSpec/servlet-3_0-final-spec.pdf - 第 10.5 节,最后一段

Web 应用程序类加载器必须从 WEB-INF/classes 加载类首先是目录,然后是 WEB-INF/lib 目录中的库 JAR。

关于java - 从 .war 文件加载类的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466526/

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