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

任何人都可以解释从Tomcat中的lib目录加载jar文件的顺序吗? 是否按字母顺序? 随机? 或者其他一些命令?

这一切都在Tomcat的ClassLoading HOW-TO中描述 。 这不一定是按字母顺序。 如果你观察到这种行为,如果你打算让你的web应用程序跨服务器移植, 绝对不应该依赖它。 例如,Tomcat 6“巧合”地命令它,但Tomcat 8不会。

总结一下,装货顺序如下:

  1. bootstrap / system( JRE/lib ,然后是server.loader
  2. webapp库( WEB-INF/classes ,然后是WEB-INF/lib
  3. 通用库( common.loader ,然后是Tomcat/lib
  4. 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是随机决定的底层文件系统。

https://issues.apache.org/bugzilla/show_bug.cgi?id=57129

我完全同意BalusC提供的答案。 只需要添加就是当从相应的类加载器加载JAR时,它会检查字母顺序。

我有一个情况,加载我的Web应用程序中的“XSSFWorkbook”从Excel表格中读取数据,并有两个JARS“poi-ooxml-3.9.jar”和“org.eclipse.birt.runtime_4.3.1.v20130918-1142.jar”具有相同的类名和包结构。 我只是把它的字母顺序重新排列在旁边,这对我来说是一个骗术。 只是想分享一样。

祝你好运