【问题标题】:Order of JAR loading inside EAR's APP-INF/lib在 EAR 的 APP-INF/lib 中加载 JAR 的顺序
【发布时间】:2010-12-01 01:02:10
【问题描述】:

将具有 Class-Path 属性的 MANIFEST.MF 文件添加到 EAR 内的 META-INF 目录会影响 WebLogic 8.1 下位于 APP-INF/lib 中的 JAR 的加载顺序吗?

【问题讨论】:

    标签: java jar weblogic packaging ear


    【解决方案1】:

    我不相信你可以通过 MANIFEST.MF 的 ClassPath 属性来控制 APP-INF/lib 的顺序。

    根据客户的不同,我采用了几种不同的方法。

    1. 将补丁 jar 添加到 WLS 的系统类路径中。如果您检查 domain/bin/setDomainEnv.sh(或 .cmd),应该有 pre、post、patch 类路径环境变量。您可以尝试在此处将补丁 jar 添加到类路径中。这使其可用于所有应用,这可能不是您的客户想要的。
    2. 修补 somejar.jar 并将其命名为 somejar-patched.jar。将 APP-INF/lib 中的 jar 替换为“-patched”版本。

    【讨论】:

    • 我想我会坚持第二种方式,因为我还没有找到任何可以控制 APP-INF/lib 顺序的东西。至于第一种方式,它会给我带来问题,因为旧的库 jar 仅位于 EAR 内部,并且将其一些修补类放入系统类路径将使它们出现在不同的类加载器中,并且它们不会看到依赖类来自 EAR 内的 JAR。基本上,它很可能会因 ClassNotFoundException 或 NoClassDefFoundException 而失败。
    • 是的,这可能是个问题。请记住,如果 Java 开发人员死去并下地狱,他们必须永远调试类加载器问题。
    【解决方案2】:

    我认为类加载器会读取您的应用程序需要的 JAR。

    我有两个问题要问你:

    1. 为什么您仍在使用 WebLogic 8.1?现在不支持了,当前版本是 10.x。你落后了两个版本。这是尚未迁移的旧版应用程序吗?您将通过升级获得很大的提升,因为您将使用带有 -server 选项的 JDK 5 或 6。我会推荐它。
    2. 为什么要关心加载顺序?容器如何加载和管理 bean 对您的应用来说应该无关紧要。

    更新:

    这听起来不一样,几乎就像您与服务器 JAR 发生冲突一样。 prefer-web-inf-classes 针对这种情况的设置。是这个意思吗?

    【讨论】:

    • 1.不是我,是我的客户在使用它;)。我告诉他们几乎和你一样的事情:)
      2. 因为我需要为一些旧库提供一个补丁而不改变它。通常的技巧之一是将你的 jar 放在同一个类加载器中的原始 jar 之前。
    • @superfilin 关于第 2 点),这确实是传统上应用补丁 (CR) 的方式。
    【解决方案3】:

    我同意duffymo

    您不必担心类加载的顺序,如果这是由于类冲突造成的,您始终可以使用 Maven 或类似工具从 Jars 中排除冲突的类。

    例如,这是一个添加 jersey-spring4 jar 的非常简单的示例,但我排除了它的依赖项,因此我可以使用不同版本的 spring 框架库。

    <dependency>
      <groupId>org.glassfish.jersey.ext</groupId>
      <artifactId>jersey-spring4</artifactId>
      <exclusions>
        <exclusion>
          <artifactId>spring-web</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
          <artifactId>spring-aop</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
          <artifactId>spring-context</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
          <artifactId>spring-beans</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    

    【讨论】:

    • 这应该作为评论添加,而不是答案。
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2011-07-25
    • 2016-02-06
    相关资源
    最近更新 更多