java - Tomcat 中的第三方库最佳实践

标签 java tomcat

我使用 Tomcat 托管我的 Java Web 和 Web 服务应用程序已有很长时间了。目前主要用于 SpringGrails 应用程序。

最近在一个项目中出现了关于如何处理 Tomcat 生产环境中的依赖项/库的讨论:

在我的项目中,我正在部署大型 WAR 文件,在 WEB-INF/lib 文件夹中包含应用程序所需的所有依赖项。我放在 tomcat/lib 文件夹中的唯一内容是用于由 tomcat 管理的 JDBC 连接的 JAR 文件。

客户与 WebSphere 有很长的历史,认为容器应该包含大部分所需的依赖项。因此,他们希望将使用过的框架或 WebService API(如 Metro)的 JAR 文件放在 tomcat/lib 文件夹中,并拥有瘦身 WAR 文件

在我看来,该解决方案的问题在于,如果您的应用程序需要另一个版本的依赖项,而该依赖项已包含在 tomcat/lib 文件夹中,您可能会遇到错误和奇怪的行为。

有没有关于这个问题的最佳实践或官方文件?您对此有何看法?

最佳答案

将依赖的 jar 打包到 war 文件中可能会产生更大的 war 文件,但它提供了很多好处。大型 war 文件成为一个独立的、完整的部署单元。您可以获取该 war 文件并将其部署到开发人员桌面、客户验收环境和生产环境,并确信您在 war 文件中的代码引用了所有依赖项的预期版本。

根据我的经验,唯一将 jar 文件而不是 war 文件放入 Tomcat 的 lib 文件夹的情况是当您的代码通过接口(interface)引用某个库时,并且直到部署时您才知道底层实现。例如,我有一个与 JMS 集成的项目,我知道我必须支持消息基础设施的多个部署。一些环境需要使用 ActiveMQ。其他环境需要使用 Websphere MQ。在这种情况下,我将 JMS 接口(interface) jar 打包到 war 文件中,然后在部署时,我将 ActiveMQ 或 Websphere MQ 实现 jar 放入 tomcat/lib 中。

当然,这意味着 war 文件不再是一个完整的部署单元。相反,部署是一个两步过程。这是一个权衡。我认为这比管理多个 war 文件构建变体更容易,每个变体都捆绑一个不同的 JMS 提供程序 jar。

关于java - Tomcat 中的第三方库最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397334/

相关文章:

java - 如果服务器端 hibernate 查询的字符串仅与整数连接,是否容易受到 SQL 注入(inject)的攻击?

java - 如何使用 Spring reactive 通过增量进度更新逐一处理每个产品?

java - Swagger Codegen,Maven 插件 : Restrict Server Generation

tomcat - 如何使用tomcat强制执行https?

java - Tomcat Web 应用程序 - 指定 TransformerFactoryImpl 类不起作用

java - 桌面应用程序帮助框架

java - Mockito:试图监视方法正在调用原始方法

java - CORS 过滤器未按预期工作

java - 错误404;类型状态报告;描述请求的资源不可用对于我的 struts2 应用程序

web-services - Tomcat,JAX-RS( Jersey ),@PathParam : how to pass two variables containing slashes