从 lib 目录加载 jar 文件的顺序
谁能解释一下从Tomcat中的lib目录中加载jar文件的顺序?是按字母顺序排列的吗?随机?还是其他订单?
谁能解释一下从Tomcat中的lib目录中加载jar文件的顺序?是按字母顺序排列的吗?随机?还是其他订单?
这一切都在Tomcat的ClassLoading HOW-TO中有所描述。它不一定按字母顺序排列。如果您观察到该行为,则绝对不应依赖它,如果您打算保持Web应用程序在服务器之间的可移植性。例如,Tomcat 6“巧合地”订购了它,但Tomcat 8没有。
综上所述,装货顺序如下:
JRE/lib
server.loader
)WEB-INF/classes
WEB-INF/lib
)common.loader
Tomcat/lib
) shared.loader
)如果您想保证 JAR X 在 JAR Y 之后加载,则需要将 JAR X 放在上面列表后面显示的位置之一。
但是,也有例外,在tomcat文档中提到了这些例外。
最后,Web 应用程序类装入器将始终首先委托 JavaEE API 类,用于 Tomcat 实现的规范(Servlet、JSP、EL、WebSocket)。Tomcat 中的所有其他类装入器都遵循通常的委派模式。
这意味着如果一个webapp包含任何JavaEE类(),那么它将被tomcat忽略。javax.*
对于每个装入器,只要需要导入/执行类,并且尚未装入,JVM 就会按顺序装入类。
实际上,它是按字母顺序排列的!(在特定目录中,例如原始海报提到的“lib”目录。
更具体地说,如果您查看 Tomcat 6 的源代码,在 类 中,该方法调用找到的 jar 的文件名数组。FileDirContext
list()
Arrays.sort()
我也手动测试了这一点。我用一个调用 的 JSP 创建了一场战争,并将两个几乎相同的 jar(包含稍微不同的版本)放入 WEB-INF/lib 目录中。一个说“你好,世界”,另一个说“再见,残酷的世界”。HelloWorld.getGreeting()
HelloWorld
如果我将“Hello,world”版本命名为a.jar和“goodbye”版本b.jar,然后重新启动Tomcat,我就会得到“Hello”文本。如果我将罐子命名为另一个“方式”并重新启动Tomcat,我就会得到“再见”文本。
据我所知,这种行为没有记录在案,没有指定,也不应该被依赖。但它是按字母顺序排列的 - 目前。