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

Rox*_*ana 6 java tomcat classloader

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

Ang*_*ity 6

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

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

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

如果你想检测所有这些类型的重复项,请看看我写的这个工具,JHades.它包括一个命令行工具,列出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
Run Code Online (Sandbox Code Playgroud)


Tim*_*m B 3

我希望这种行为与您在其他地方遇到这种情况时的行为相同。

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

  • 它是同一个类,我的意思是包含两次相同的编译类。我不知道会发生什么 - 这就是我问的原因......:) (2认同)
  • 不用担心。完全不用担心。 (2认同)