将挂毯罐部署到 tomcat lib 目录是错误的吗?

is it wrong to deploy tapestry jars into tomcat lib directory?

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

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

如果 运行 拥有 self-contained war 个文件,每个文件都包含尽可能多的所需依赖项,而不是依赖 "provided" 依赖项或其他 class 路径依赖项。在某些情况下(但不是很多)您需要将 jars 放在 war 文件之外,以便服务器可以在启动时访问它们,但这听起来不像是其中一种情况。

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

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

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