【问题标题】:Are there reasons to place a dependency in a web server's lib directory instead of including it in the War file?是否有理由将依赖项放在 Web 服务器的 lib 目录中,而不是将其包含在 War 文件中?
【发布时间】:2009-09-17 12:59:51
【问题描述】:

如果我的应用程序有一个依赖 Jar,是把它放在 war 文件 lib 目录中还是放在全局应用程序服务器(如 Tomcat)的 lib 目录中更好?使用一种方法而不是另一种方法可以获得什么?

磁盘空间浮现在脑海中,但我们生活在磁盘空间便宜的时代。内存使用有区别吗?比我更有经验的人能否列出这两种选择的优缺点?

【问题讨论】:

    标签: deployment tomcat war application-server


    【解决方案1】:

    一般来说,让 WAR 自包含要好得多,这样您就不必依赖容器配置。它也使部署更加容易。因此,如果可以,请尝试将库放入 WAR 中。

    但是,我在将库安装到容器时遇到了一些情况。例如,

    1. 我们有一些内部库供每个 web 应用使用,它们非常庞大。我们将它们安装到容器中,这样所有的 Web 应用程序都使用相同的版本,并且还节省了内存和磁盘空间。

    2. 安装在 WEB-INF/lib 中的库对容器不可用。如果您需要在 context.xml 中引用这些(如参考资料中定义的 JDBC 驱动程序),您必须将它们放在 server/lib 中。

    3. 如果你想将所有 web 应用程序的 log4j 日志发送到同一个文件,你必须将 log4j jar 放在 server/lib 中。否则,每个 web 应用都会使用自己的记录器。

    【讨论】:

    • 关于第 3 点,反之亦然吗?我将 log4j 放在服务器/lib 中,因为一切都在使用它,但我不希望一切都进入同一个文件。有没有办法解决这个问题?
    • 是的。请参阅我对这个问题的回答:stackoverflow.com/questions/1332691/…
    【解决方案2】:

    如果您想使用容器的资源管理功能——例如连接到 SQL 数据库并为其提供 JNDI 查找和连接池——然后容器软件本身将需要访问库和驱动程序来管理资源。

    否则您可能不想将它们安装在服务器 /lib 目录中并假设它们在那里并且可以工作,因为不同的 Web 应用程序可能有细微的不同版本要求。

    【讨论】:

      【解决方案3】:

      有关 Catalina 实现的类加载器层次结构的深入描述,您应该查看 Tomcat 的Class Loaders HOW-TO。这将帮助您了解何时使 jar 可用于容器、所有 web 应用、仅用于单个 web 应用......以及放置它们的位置。

      【讨论】:

        猜你喜欢
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        相关资源
        最近更新 更多