我有一个Web应用程序和两个类文件,
第一个类是 MyClass.class ,它位于abc.jar文件(WEB-INF / lib / abc.jar)中并且 第二类是 YourClass.class ,它位于classes文件夹(WEB-INF / classes / YourClass.class)中。
我的问题是,当应用程序启动时,哪个类会首先加载?为什么?
答案 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>