在tomcat中部署的war中有两次相同的编译类会发生什么?
(我知道这不是一个好习惯,等等,但幕后发生了什么?)
是否存在令人讨厌的副作用的可能性?
答案 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)
我希望这种行为与你遇到其他任何情况的行为相同。
将使用类加载器找到的第一个类,另一个将被忽略。