在tomcat中部署的war中你有两次相同的类会发生什么?

时间:2014-01-11 12:15:30

标签: java tomcat classloader

在tomcat中部署的war中有两次相同的编译类会发生什么? (我知道这不是一个好习惯,等等,但幕后发生了什么?)
是否存在令人讨厌的副作用的可能性?

2 个答案:

答案 0 :(得分:6)

如果你有一个类在WEB-INF / classes中而另一个在jar中,那么WEB-INF / classes中的一个将具有优先权。

如果两个类都在一个jar中,那么其中一个将被占用而另一个被忽略。选择的那个取决于类加载器的实现细节,并且可以从环境到环境不同。

因此,可能会在开发中选择正确的类,而生产中的错误类会导致难以调试的问题。解决此问题的唯一方法是从WAR中删除所有重复的类,这样只会在任何地方选择一个类。

如果要检测所有这些类型的重复项,请查看我写的这个工具JHades。它包含一个command line tool,列出WAR中的所有重复项:

java -jar jhades-standalone-report.jar path/to/war/webapp.war

>>>> Jar overlap report:

poi-3.5-FINAL-20090928.jar overlaps with poi-3.7-20101029.jar - total overlapping classes: 990
xercesImpl-2.7.0.jar overlaps with xercesImpl-2.9.1.jar - total overlapping classes: 867
xalan-2.6.0.jar overlaps with xalan-2.7.1.jar - total overlapping classes: 711
bcel-5.2.jar overlaps with xalan-2.7.1.jar - total overlapping classes: 361
xml-apis-2.9.1.jar overlaps with xml-apis.jar - total overlapping classes: 301
jasperreports-applet-3.7.1.jar overlaps with jasperreports-javaflow-3.7.1.jar - total overlapping classes: 254
jasperreports-3.7.1.jar overlaps with jasperreports-applet-3.7.1.jar - total overlapping classes: 254
...

Total number of classes with more than one version: 6169

答案 1 :(得分:3)

我希望这种行为与你遇到其他任何情况的行为相同。

将使用类加载器找到的第一个类,另一个将被忽略。