【问题标题】:Jar dependency - Application server classpath vs adding it to the application war itselfJar 依赖项 - 应用程序服务器类路径与将其添加到应用程序战争本身
【发布时间】:2014-12-09 20:22:39
【问题描述】:

我们安装了 Weblogic 10.3.6。 在其上运行的应用程序需要以下 jar

com.oracle.ws.http_client_1.3.0.0.jar

上面的jar位于服务器包Oracle\Middleware\modules\com.oracle.ws.http_client_1.3.0.0.jar

什么是正确的方法? 应该将此 jar(似乎是 Oracle 编写的系统库,在 mvnrepository 站点上找不到)添加到服务器类路径中还是应该将其添加到应用程序存档(war)中?谢谢。

更新:上述 jar 也与 Weblogic 捆绑在一起(默认情况下未添加到类路径中),并且在 maven 公共存储库中找不到。那么,这不是要直接添加到应用程序中吗?

【问题讨论】:

    标签: java jar classpath war weblogic-10.x


    【解决方案1】:

    放置 JAR 文件和其他依赖项的最佳位置是将其打包 在 WAR 中,而不是保留在 system classpath 中。通过做这个 你有以下优势。

    1. WAR 文件可自我维持且健壮,无需任何依赖 这是container
    2. 相同的WAR文件,无需任何打包更改即可 部署到 DEV、IT、QA、Demo、Test、Production、blah、blah 或任何环境 展示。
    3. systemwebapp classloaders 之间没有问题。

    可能存在争议,因为将所有内容打包到 WAR 文件中可能会结束 显着增加 WAR 文件大小。但它真的 当出现一个有趣的生产错误时令人沮丧 半夜只是因为你错过 更新 http_client_1.3.0.0.jarhttp_client_1.4.x.y.jar其他人明确指出完全相同的 WAR 文件 在测试环境中运行良好。

    根据我的经验,我认为 WAR 文件的一致性是一个重要方面。因此,建议您将所有需要的 JAR 文件打包到 WAR 中,除非该 JAR 是由容器隐式提供的。

    • 每 GB 磁盘空间成本 = 1 美元
    • 解决不一致问题的努力 = 50 美元
    • 放弃午夜睡眠来解决一个疯狂的问题 = 无价

    :)

    【讨论】:

    • 有问题的 jar 仅与 Weblogic Server 捆绑在一起,并且在任何公共存储库(mvn repo、apache repo)等中都不可用。所以 com.oracle.ws.http_client_1.3.0.0。 jar 不是要捆绑为 WAR 文件的一部分吗?这是我在问题中的原始问题
    • 由于存在多个用于 HttpClient 的 JAR 供类加载器加载,我建议将其打包到 WAR 中。这完全没问题。
    • “显着增加 WAR 文件的大小”在现在 巨大 磁盘驱动器的时代,WAR 的大小很少成为问题。
    【解决方案2】:
    1. 如果 jar 是应用程序服务器环境/构建的一部分,我不会将它添加到 war/ear 文件中。它应该在所有 env DIT/UAT/PROD 中都可用(envs 需要与 prod 一致)。此外,当应用服务器修复或服务器升级时,我们将使用最新的 jar。

    2. 在其他情况下(外部)最好将其打包在 war 中,以避免从 env 迁移到 env 时出现问题。

    【讨论】:

      【解决方案3】:

      这取决于。当您在类路径中插入依赖项时,默认类加载器会加载它 - 然后例如所有枚举和单例都由这个默认的类加载器初始化。根据服务器的配置,所有应用程序都将共享这些实例,或者它们可能会获得自己的独立实例化。

      此外,当您将依赖项添加到类路径时,服务器上的所有应用程序都可以使用它,无论它们是否需要。

      如果你只有一个应用程序,它不会有什么不同。如果还有更多,将 JAR 添加到应用程序会更安全,除非您明确想让这个库(和这个特定版本)在服务器上全局可用以供所有部署的 WAR 使用。

      编辑:

      显然,您可以确定每个应用程序都有自己的枚举和单例实例,如here 所述。因此,您在类路径方法中的唯一问题是不同的应用程序是否需要同一库的不同版本。

      【讨论】:

      • 我同意“这取决于”,但在这种情况下,jar 由 Oracle 开发并与 EE 服务器捆绑在一起。所以它不是要添加到WAR文件中的吗?
      • 如果它与 EE 服务器捆绑在一起,它应该可供该服务器上的所有应用程序开箱即用,因此您不应将其添加到 WAR 中。也不需要手动将其添加到类路径中。如果您想部署到其他可能没有它的服务器,只需制作 2 个版本的 WAR 并部署适合该服务器的版本。
      猜你喜欢
      • 2014-06-04
      • 2023-04-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多