Web应用程序启动时首先加载哪个类?

时间:2009-05-24 17:30:27

标签: java servlets classloader

我有一个Web应用程序和两个类文件,

第一个类是 MyClass.class ,它位于abc.jar文件(WEB-INF / lib / abc.jar)中并且 第二类是 YourClass.class ,它位于classes文件夹(WEB-INF / classes / YourClass.class)中。

我的问题是,当应用程序启动时,哪个类会首先加载?为什么?

4 个答案:

答案 0 :(得分:9)

根据我的经验,您无法预测JVM加载类的顺序。

一旦我做了一个测试运行器(有点Maven的Surefire)并且使用相同的JVM和OS,它在不同的机器上运行时以不同的顺序加载类。吸取的教训是:

  

您不应该构建应用程序   依赖类加载顺序

答案 1 :(得分:5)

根据需要加载类,用于“需要”的某些定义。加载类时恰好取决于JRE实现,javac实现,究竟是什么线程,服务器代码,当然还有应用程序代码。在这个领域做出假设是一个坏主意。如果您想查看特定运行的情况,可以使用-verbose:class

答案 2 :(得分:3)

Sun的class loader docs总是说WEB-INF / classes OR WEB-INF / lib,但没有说明会先检查哪一个。

来自IBM docs

  

“加载类的规则在JVM规范中有详细说明。基本原则是类只在需要时加载(或者至少看起来像这样加载 - JVM在实际加载方面有一定的灵活性,但必须维护一个固定的类初始化序列。)每个加载的类可能都有其它依赖的类,因此加载过程是递归的。“

所以我认为答案是:它取决于您的应用程序首先需要哪些类。

答案 3 :(得分:1)

正如duffymo所指出的,这可能会有所不同。确定此特定应用程序的顺序的一种方法是在类构造函数和Web Web应用程序页面加载方法中插入Response.Write文本。 “A类中的实例化对象”,“打开的网页MyPage”等等。

一旦你弄明白了这个序列,就要注释掉那些代码,这样你以后可以重用它们来验证你是否没有对序列进行过更改(例如更早或更晚地实例化对象)。 / p>