【问题标题】:is it wrong to deploy tapestry jars into tomcat lib directory?将挂毯 jar 部署到 tomcat lib 目录中是错误的吗?
【发布时间】:2016-01-15 16:49:29
【问题描述】:

我正在运行一个 tomcat 8 服务器,我在其中部署了几个 Tapestry Web 应用程序。当我使用 maven 构建 war 文件时,所有依赖项(包括 Tapestry 框架 jar)都打包到 WEB-INF/lib 中。所以我在每场战争中都有挂毯罐。据我所知,tomcat 对每个 war 文件使用不同的类加载器,所以也许我使用的内存资源比需要的多,这是我的担心。

我所做的是将挂毯 jar 部署到 ${catalina.base}/lib/tapestry 并相应地更新 catalina.properties 以便 tomcat 将 jar 加载到此目录中。此外,我更改了项目的 maven 依赖项,以便挂毯库不会打包到 WEB-INF/lib 中。它似乎工作。但我想知道这种工作方式是否有问题,可能会在未来带来问题。似乎没有人这样做:我在 Tapestry 网站上找不到任何信息,说明这是一个好政策还是坏政策,以及为什么。有人知道吗?

【问题讨论】:

    标签: java tomcat web-applications classloader tapestry


    【解决方案1】:

    从长远来看,拥有独立的 war 文件会更好,每个文件都包含尽可能多的所需依赖项,而不是依赖于“提供的”依赖项或其他类路径依赖项。在某些情况下(但不是很多),您需要将 jar 放在 war 文件之外,以便服务器可以在启动时访问它们,但这听起来不像是其中一种情况。

    将 Tapestry jar 放在共享位置将是一个完全可以忽略不计的优化。此外,如果您的某个应用需要不同版本的 Tapestry,以后可能会出现问题。

    另一个潜在问题是,如果您切换到与 Tomcat 不同的应用程序服务器(甚至是不同版本的 Tomcat)。不同的应用服务器以不同的方式处理类加载,这是您要解决的最后一类问题。

    【讨论】:

    • 感谢您的助手。当你说只有在某些情况下才需要把罐子放在战争之外时,你是不是在考虑here所描述的情况?
    • @Mandarin 没错——数据库驱动程序是最常见的情况,您希望将 jar 文件放在服务器的 lib 文件夹中。
    【解决方案2】:

    不,没有错。我以前做过这样的瘦身战争部署。除了部署 Tapestry 库,您还可以将所有“很少更改”的依赖项部署到 Tomcat lib 目录。您获得的是部署新版本战争所需的总时间,因为所有代码的大小通常只是包含所有依赖项的整个战争文件大小的一小部分。权衡是增加的部署复杂性,即使您单独部署的库与您的应用程序保持同步,因为最终您也希望对它们进行更改。这种权衡是否值得取决于您的应用程序的个人需求以及您的开发和部署速度。这一切都很好,因为 Tomcat 实现了类加载器层次结构 (https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html)。但是,通过 common 类加载器加载类的一个潜在问题是它可能会放大内存泄漏,因为与 webapp 类加载器不同,common 仅在容器停止时才会被卸载。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多