我不太清楚Tomcat中的类加载是如何进行的,我们在单个Tomcat服务器上部署了多个Spring Web应用程序。为了减少内存占用,我们考虑将Spring、Hibernate和数据库驱动程序JAR文件放在Tomcat lib文件夹中,以便这些文件能被所有Web应用程序共享。我首先标记Spring依赖关系为“provided”,并将这些JAR文件复制到Tomcat lib中。但是,在服务器启动时,我开始收到多个ClassNotFoundErrors错误,例如对于commons-logging、commons-fileupload和jackson等。因此,我不得不将这些JAR文件也移动到Tomcat lib中。但是这让我感到有些可疑。如果将来我向项目添加另一个Spring依赖项,例如Spring-data-cassandra,是否还需要移动其相关的JAR文件?这可能是无法解决的问题。此外,我可能会在运行时遇到CNF错误。
我试图跟随this链接,并将spring-context和spring-web带回应用程序war。但是它没有起作用,在
然后我找到了一个完全不同的JDBC驱动程序加载解释,这有点与所有其他解释相矛盾,让我完全困惑了。
随着我阅读更多,我认为将Spring JAR文件移动到Tomcat lib中不是正确的方法,但仍然没有得到充分的理由。那么为什么JDBC驱动程序可以工作呢?有人可以解释一下吗?此外,每个Web应用程序的类加载器是否会创建每个类的副本?
我试图跟随this链接,并将spring-context和spring-web带回应用程序war。但是它没有起作用,在
WebApplicationIntializer
初始化期间出现了一些类的ClassNotFound错误。我试图理解在tomcat中加载类的顺序,但并没有理解太多。然后我找到了一个完全不同的JDBC驱动程序加载解释,这有点与所有其他解释相矛盾,让我完全困惑了。
随着我阅读更多,我认为将Spring JAR文件移动到Tomcat lib中不是正确的方法,但仍然没有得到充分的理由。那么为什么JDBC驱动程序可以工作呢?有人可以解释一下吗?此外,每个Web应用程序的类加载器是否会创建每个类的副本?
编辑1:我了解到spring jars中有一些依赖是可选的,如果在我的webapp中使用,将会被需要。所以spring-web依赖于jackson库,但对于我的应用程序来说是可选的。因此,我需要找出哪些jar包是我的项目所需的,并且也是spring所需的,这些jar包需要移动到tomcat lib中。
可选的
。因此,找出我需要的传递性依赖关系真的很困难。 - sidgate