【发布时间】:2016-01-06 01:53:32
【问题描述】:
我对类加载在 tomcat 中是如何发生的完全感到困惑。如果我的问题听起来很愚蠢,请多多包涵。
我们在单个 tomcat 服务器上部署多个 spring webapps。为了减少内存占用,我们考虑在 tomcat lib 文件夹中包含 spring、hibernate 和数据库驱动程序 jar,以便所有 webapps 共享它们。
我首先将 spring 依赖项标记为 provided 并将这些 jar 复制到 tomcat lib。但是在服务器启动时,我开始收到多个ClassNotFoundErrors,例如commons-logging、commons-fileupload、jackson,所以我不得不将这些jar 也移动到tomcat lib。
但后来这开始感觉可疑。如果将来我在我的项目中添加另一个 spring 依赖项,比如 spring-data-cassandra。我还需要移动它的依赖罐子吗?这可能是无止境的。我也可能在运行时遇到 CNF 错误。
我尝试关注this 链接并将 spring-context 和 spring-web 带回应用程序大战。但它没有用,在 WebApplicationIntializer 初始化期间在某些类上获得了 ClassNotFound。我试图理解classes getting loaded in tomcat 的顺序,但看不懂。
然后我为JDBC driver loading 找到了一个完全不同的解释,这与所有其他解释有点矛盾,让我完全困惑。
当我阅读更多时,我认为将 spring jar 移动到 tomcat lib 不是正确的方法,但仍然没有很好的理由。那么为什么 JDBC 驱动程序有效?有人可以解释一下吗?每个 webapp 的类加载器也会创建每个类的副本吗?
编辑 1:我开始知道 Spring jar 中很少有依赖项是 optional,如果在我的 webapp 中使用,则需要这些依赖项。所以 spring-web 依赖于 jackson 库,但对于我的应用程序是可选的。所以我需要找出我的项目需要哪些 jars 并且 spring 也需要这些 jars,这些 jars 需要移动到 tomcat lib。
【问题讨论】:
标签: java spring tomcat classloader