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

Java 当Web应用程序启动时,哪个类将首先加载?,java,servlets,classloader,Java,Servlets,Classloader,我有一个web应用程序和两个类文件 第一个类是MyClass.class,它位于abc.jar文件(WEB-INF/lib/abc.jar)中,并且 第二个类是YourClass.class,它位于classes文件夹(WEB-INF/classes/YourClass.class)中 我的问题是,当应用程序启动时,哪个类将首先加载?为什么呢?Sun总是说WEB-INF/classes或WEB-INF/lib,但没有说先检查哪一个 发件人: “加载类的规则在JVM规范中有详细说明。基本原则是,类

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

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

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

Sun总是说WEB-INF/classes或WEB-INF/lib,但没有说先检查哪一个

发件人:

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


因此,我认为答案是:这取决于应用程序首先需要哪些类。

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

有一次,我做了一个测试运行程序(有点像Maven的Surefire),当在不同的机器上运行时,它使用相同的JVM和操作系统以不同的顺序加载类。吸取的教训:

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


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


一旦确定了序列,请注释出这些序列的代码,以便以后可以重用它们,以验证您没有做出影响序列的更改(例如更早或更晚实例化对象)。

根据需要加载类,以定义“需要”。加载类的确切时间取决于JRE实现、javac实现、线程的具体用途、服务器代码,当然还有应用程序代码。在这方面做假设是个坏主意。如果您想查看特定运行的情况,可以使用