从 lib 目录加载 jar 文件的顺序

2022-09-01 01:49:41

谁能解释一下从Tomcat中的lib目录中加载jar文件的顺序?是按字母顺序排列的吗?随机?还是其他订单?


答案 1

这一切都在Tomcat的ClassLoading HOW-TO中有所描述。它不一定按字母顺序排列。如果您观察到该行为,则绝对不应依赖它,如果您打算保持Web应用程序在服务器之间的可移植性。例如,Tomcat 6“巧合地”订购了它,但Tomcat 8没有。

综上所述,装货顺序如下:

  1. 引导/系统(,然后JRE/libserver.loader)
  2. Web 应用库(然后WEB-INF/classesWEB-INF/lib)
  3. 公共库(,然后common.loaderTomcat/lib)
  4. web 应用程序共享库 (shared.loader)

如果您想保证 JAR X 在 JAR Y 之后加载,则需要将 JAR X 放在上面列表后面显示的位置之一。

但是,也有例外,在tomcat文档中提到了这些例外。

最后,Web 应用程序类装入器将始终首先委托 JavaEE API 类,用于 Tomcat 实现的规范(Servlet、JSP、EL、WebSocket)。Tomcat 中的所有其他类装入器都遵循通常的委派模式。

这意味着如果一个webapp包含任何JavaEE类(),那么它将被tomcat忽略。javax.*

对于每个装入器,只要需要导入/执行类,并且尚未装入,JVM 就会按顺序装入类。


答案 2

实际上,它是按字母顺序排列的!(在特定目录中,例如原始海报提到的“lib”目录。

更具体地说,如果您查看 Tomcat 6 的源代码,在 类 中,该方法调用找到的 jar 的文件名数组。FileDirContextlist()Arrays.sort()

我也手动测试了这一点。我用一个调用 的 JSP 创建了一场战争,并将两个几乎相同的 jar(包含稍微不同的版本)放入 WEB-INF/lib 目录中。一个说“你好,世界”,另一个说“再见,残酷的世界”。HelloWorld.getGreeting()HelloWorld

如果我将“Hello,world”版本命名为a.jar和“goodbye”版本b.jar,然后重新启动Tomcat,我就会得到“Hello”文本。如果我将罐子命名为另一个“方式”并重新启动Tomcat,我就会得到“再见”文本。

据我所知,这种行为没有记录在案,没有指定,也不应该被依赖。但它是按字母顺序排列的 - 目前。


推荐