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

标签 java web-applications classloader

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

这是假设的场景...有一个 .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/

相关文章:

java - java线程和系统线程有什么关系

javascript - 检测 iOS-WebApp 并更改 CSS 属性

Java:如何将存储为 byte[] 的类加载到 JVM 中?

java - 为什么我切换机器后这段代码就停止工作了?

java - 菜单打开时的操作

java - 从一个类调用另一个类的方法

java - 解析SQL命令

php - 像 Facebook 这样的网站如何处理对象关系?

java - 过时的 Java 小程序

java - 我如何枚举Java中父类(super class)的所有子类