从lib目录加载jar文件的顺序
任何人都可以解释从Tomcat中的lib目录加载jar文件的顺序吗? 是否按字母顺序? 随机? 或者其他一些命令?
这一切都在Tomcat的ClassLoading HOW-TO中描述 。 这不一定是按字母顺序。 如果你观察到这种行为,如果你打算让你的web应用程序跨服务器移植, 绝对不应该依赖它。 例如,Tomcat 6“巧合”地命令它,但Tomcat 8不会。
总结一下,装货顺序如下:
- bootstrap / system(
JRE/lib
,然后是server.loader
) - webapp库(
WEB-INF/classes
,然后是WEB-INF/lib
) - 通用库(
common.loader
,然后是Tomcat/lib
) - webapp共享库(
shared.loader
)
如果您想要保证JAR X 在 JAR Y 之后被加载,那么您需要将JAR X放置在上面列表中稍后显示的其中一个位置。
但是,有一些例外,在tomcat文档中提到
最后,Web应用程序类加载器将总是首先为JavaEE API类委派Tomcat实现的规范(Servlet,JSP,EL,WebSocket)。 Tomcat中的所有其他类加载器都遵循通常的代理模式。
这意味着如果一个webapp包含任何JavaEE类( javax.*
),那么它将被tomcat忽略。
对于每个加载器,只要JVM按照需要导入/执行的顺序加载这些类,并且尚未加载,
其实这是字母顺序! (在特定的目录中,例如原始海报提到的'lib'目录。)
更具体地说,如果您查看Tomcat 6的源代码,则在类FileDirContext中,方法list()会调用Arrays.sort(),以查找find的JAR文件名的数组。
我也手动testing过。 我用一个调用HelloWorld.getGreeting()的JSP创build了一场战争,并将包含略有不同版本的HelloWorld的两个几乎相同的jar放到WEB-INF / lib目录中。 一个说“你好,世界”,另一个说“再见,残酷的世界”。
如果我把“Hello,world”的版本命名为“a.jar”和“goodbye”的版本是b.jar,并且重新启动Tomcat,我会得到“Hello”文本。 如果我把这个jar子命名为另一个,重新启动Tomcat,我会得到“Goodbye”文本。
据我已经能够确定,这种行为是没有logging,没有指定,不应该依靠。 但现在是按字母顺序的。
订购WEb-INF / lib文件夹中的加载jar子。
对于tomcat 5-7,订单是按字母顺序排列的。 它使用sorting。
对于tomcat 8是随机决定的底层文件系统。
我完全同意BalusC提供的答案。 只需要添加就是当从相应的类加载器加载JAR时,它会检查字母顺序。
我有一个情况,加载我的Web应用程序中的“XSSFWorkbook”从Excel表格中读取数据,并有两个JARS“poi-ooxml-3.9.jar”和“org.eclipse.birt.runtime_4.3.1.v20130918-1142.jar”具有相同的类名和包结构。 我只是把它的字母顺序重新排列在旁边,这对我来说是一个骗术。 只是想分享一样。
祝你好运