Jar依赖项 - 应用程序服务器类路径vs将其添加到应用程序war本身

时间:2014-10-14 21:52:24

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

我们安装了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(默认情况下没有添加到classpath),并且在maven public repo中找不到。那么,这不是要直接添加到应用程序中吗?

3 个答案:

答案 0 :(得分:9)

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

  1. WAR文件具有自我可持续性和健壮性,不依赖于 它是container
  2. 相同的WAR文件,没有任何包装更改即可 部署到DEV,IT,QA,Demo,Test,Production,blah,blah或任何环境 当下。
  3. system&之间没有问题webapp classloaders
  4. 可能存在争议,因为通过打包WAR文件中的所有内容可能会结束 显着增加WAR文件大小。但它确实如此 当有一个搞笑制作错误时,令人沮丧 深夜只是因为你错过了更新 http_client_1.3.0.0.jar http_client_1.4.x.y.jar其他人明确说明完全相同的WAR文件 在测试环境中工作得很好。

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

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

    :)

答案 1 :(得分:3)

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

此外,当您向类路径添加依赖关系时,无论是否需要,它都可供服务器上的所有应用程序使用。

如果你只有一个申请,那就不会有所作为。如果还有更多,那么将JAR添加到应用程序会更安全,除非您明确希望在服务器上全局使用此库(以及此特定版本)以供所有已部署的WAR使用。

编辑:

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

答案 2 :(得分:3)

  1. 如果jar是应用程序服务器环境/构建的一部分,我不会将它添加到war / ear文件中。它应该可以通过所有env DIT / UAT / PROD(envs需要与prod一致)。此外,当应用应用程序serever修复程序或服务器升级时,我们将使用最新的jar。

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