【问题标题】:Spring jars in tomcat lib foldertomcat lib文件夹中的spring jars
【发布时间】:2016-01-06 01:53:32
【问题描述】:

我对类加载在 tomcat 中是如何发生的完全感到困惑。如果我的问题听起来很愚蠢,请多多包涵。

我们在单个 tomcat 服务器上部署多个 spring webapps。为了减少内存占用,我们考虑在 tomcat lib 文件夹中包含 spring、hibernate 和数据库驱动程序 jar,以便所有 webapps 共享它们。

我首先将 spring 依赖项标记为 provided 并将这些 jar 复制到 tomcat lib。但是在服务器启动时,我开始收到多个ClassNotFoundErrors,例如commons-loggingcommons-fileuploadjackson,所以我不得不将这些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


    【解决方案1】:

    我会尽量解释我所知道的。

    当你在你的 tomcat 上部署 WAR 时,类加载会以这种方式发生:

    1. 在您的 WAR 类加载器中查找要加载的类
    2. 如果找不到,请移至父级(tomcat /lib 文件夹)

    在你的情况下发生的事情是 spring 也有很多依赖项,如果你在你的 war 中打包它,它的依赖项也会被打包,一切都会正常工作。但是由于你将spring定义为provided,它的所有依赖也被认为是provided,当你把它放在/lib文件夹中时,spring是可以访问的,但它的依赖不是。

    您需要做的是将所有spring依赖项和依赖项(等)的依赖项也放入lib文件夹中。另一种解决方案是在你的类加载层次结构中定义一个中间 WAR,它将包含你所有的公共库。

    【讨论】:

    • 感谢您的意见。看起来造成问题的依赖项是optional。所以很难找到我需要的传递依赖
    • 如果您使用 maven 构建您的 WAR,它会将所有可传递的 dep 打包到 WAR 工件中。
    【解决方案2】:

    如果您更喜欢创建这种类型的瘦 WAR,一种解决方案是首先收集所有运行时/提供的依赖项,然后将它们显式复制到 Tomcat 的公共(或共享)库目录下:

    如果在 Maven 项目下,收集 target/dependency 下的所有内容(包括传递依赖项):

    mvn dependency:copy-dependencies -DincludeScope=runtime
    mvn dependency:copy-dependencies -DincludeScope=provided
    

    然后,复制到库。例如:

    cp target/dependency/*.jar /usr/local/tomcat/lib/
    

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2018-09-22
      • 2015-09-10
      相关资源
      最近更新 更多