2011-03-29 51 views
27

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

+1

类似:http://stackoverflow.com/q/8364619/435605 – 2015-02-24 09:43:15

回答

27

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

概述的,加载顺序如下:

  1. 引导/系统(JRE/lib,然后server.loader
  2. web应用库(WEB-INF/classes,然后WEB-INF/lib
  3. 公共库(common.loader,然后Tomcat/lib
  4. webapp-shared libraries(shared.loader

如果你想保证JAR X之后 JARŸ加载,那么你需要把JAR X中出现上述列表中后的地方之一。

但也有例外然而,这是在tomcat docs

最后提到,Web应用程序的类加载器总是首先委托为被Tomcat(的Servlet,JSP,EL,WebSocket的实施规范JavaEE的API类)。 Tomcat中的所有其他类加载器都遵循通常的代理模式。

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

对于每个加载器,只要JVM按照需要导入/执行并且尚未加载的顺序,这些类就会按顺序加载。

+1

没有说明加载从该文件*在一个目录下的*顺序? – 2011-03-29 15:18:27

+1

@Joachim:它只是在JVM需要它的时候加载的。 OP更多地要求搜索订单。 – BalusC 2011-03-29 15:20:22

+0

谢谢BalusC。我将检查需要的工件的顺序,并希望能够得出合理的解决方案 – Damien 2011-03-29 15:31:18

28

实际上,它按字母顺序排列! (在一个特定的目录,如“lib”目录下,原来的海报提及。)

更确切地说,如果你看一下源为Tomcat 6,在FileDirContext类,文件的阵列上list()调用Arrays.sort()方法找到的罐子名称。

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

如果我将“Hello,world”版本的a.jar和“goodbye”版本的b.jar命名为,并重新启动Tomcat,则会显示“Hello”文本。如果我用另一个方式命名罐子并重新启动Tomcat,我会得到“Goodbye”文本。

据我已经能够确定,这种行为是没有记录,没有指定,不应该依靠。但现在是按字母顺序排列的。

+3

+1用于指出发布文档中的“gotcha” – bakoyaro 2011-10-26 16:27:38

+6

我可以证实这是针对Tomcat 5 + 6的,但目前有问题,因为Tomcat 8.0.9的行为不像那样! – Daniel 2014-07-13 05:47:06

1

我完全同意BalusC提供的答案。仅指向添加是指从各个类加载器加载JAR时,它会检查字母顺序。

我有一种情况在我的web应用程序中加载“XSSFWorkbook”以从Excel表格读取数据,并且有两个JARS“poi-ooxml-3.9.jar”和“org.eclipse.birt.runtime_4.3.1.v20130918- 1142.jar“,具有相同的类名和包结构。我只是将它的后面的字母顺序重新排列,并且它为我提供了一个技巧。只是想分享一样。

好运

15

订购WEb-INF/lib文件夹中已加载的罐子。

对于tomcat 5-7,订单是按字母顺序的。它使用排序。

对于tomcat 8是随机决定的底层文件系统。

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

+0

你正在接听或问一个新问题吗? – 2014-10-30 00:24:22

+0

猜一猜:)。我在回答。 – user2193008 2014-11-04 15:51:42

+0

请花些时间重新格式化您的答案,以使其看起来像一个答案。看看[如何写出一个好答案](http://stackoverflow.com/help/how-to-answer),看看如何改进你的答案。 – 2014-11-04 16:00:03

相关问题