正如评论所说,您已经正确解释了为什么观察到自己的行为。
关键是ClassLoader的结构。一个JVM中的两个ClassLoader完全有可能每个都加载一个类,因此包含静态字段的单独独立副本。“静态”使ClassLoader(而不是JVM)成为“全局”对象。我想,Tomcat无法容纳带有共享库的容器级ClassLoader,并以某种方式强制每个应用程序ClassLoader分别加载共享库。
但这对于J2EE API和实现之类的其他常见类来说有点浪费。原则上,类无论如何都不应依赖于此ClassLoader结构。
这就是为什么您不应该将应用程序依赖项放在Tomcat的共享库文件夹中的原因。那就是“解决方案”。它将您的应用程序与容器的特定设置和部署联系在一起,这违反了J2EE
Web应用程序的原理。只需将依赖项的副本放在每个应用程序的WEB-INF / lib中。
您观察到的行为是不执行此操作的另一个原因:应用程序之间的隔离度降低了。这并没有使我成为违反直觉的行为,但这只是因为我已经习惯了Tomcat如何工作并思考这些事情。



