【问题标题】:Classloader Filtering类加载器过滤
【发布时间】:2011-12-28 10:46:45
【问题描述】:

我之前问过一个相关的问题 - 但这并不完全相同。如果问题有点不同,我之前被告知不要在同一线程中提出其他问题。所以我发布了这个新问题。如果我不应该,请告诉我。

我有一个网络应用程序(war 文件)。与 apache-commons-lang 有关的 Jar 与其他 jar 文件一起添加到 WEB-INF lib 中。然而,与 apache-commons-lang 有关的旧版本的 jar 也存在于系统库中,并且在系统类路径中部署 jar 文件时优先,我收到“classnotfound”错误。必须为 WEB-INF 中指定的类指定 prefer-web-inf-classes 以优先于系统类加载器中存在的类。但是我希望只有这个特定的 jar 优先于系统类加载器。当我发布类似问题时,建议我在 weblogic 中使用“过滤类加载器”。当我有耳朵时,该解决方案效果很好。但是,我将无法在 war 文件中添加 weblogic-application.xml,也无法使用这个类加载器过滤概念。有出路吗?谢谢。

【问题讨论】:

  • 如果无法通过配置来实现,我是否有可能编写一些代码来实现这一点?谢谢!

标签: jakarta-ee weblogic-10.x java-ee-5


【解决方案1】:

我对 WebLogic 不是很熟悉,但是如果您知道如何使用较新的 jar,并且该代码的入口就像实例化一个类并执行一个启动方法一样简单,那么您可能会使用自定义的类加载器? 参见http://tshrestha.blogspot.com/2011/12/using-custom-classloader.html的示例

但我承认,一些 WebLogic 大师知道如何通过 WebLogic 本身的一些配置来实现这一点。

【讨论】:

    【解决方案2】:

    我的一位同事指出,在 weblogic.xml 中指定相关包可以解决问题。不过还是要试一试。

        <wls:prefer-application-packages>
            <wls:package-name>javax.faces.*</wls:package-name>
            <wls:package-name>com.sun.faces.*</wls:package-name>
            <wls:package-name>javax.xml.*</wls:package-name>
            <wls:package-name>org.apache.xerces.*</wls:package-name>
            <wls:package-name>antlr.*</wls:package-name>
            <wls:package-name>org.apache.log4j.*</wls:package-name>
            <wls:package-name>org.apache.commons.*</wls:package-name>
        </wls:prefer-application-packages>
    

    【讨论】:

      【解决方案3】:

      我不是 weblogic 大师,但我看到了两种方法(没有尝试过,只是猜测)

      1) 只在 WEB-INF 中保留 'prefer-web-inf-classes' 所需的 jars,并将其余的 jars 移动到不同的位置并将它们指向战争的 MANIFEST.MF

      2) 将那场战争捆绑在一个空白耳朵中,并在耳朵的 MANIFEST.MF 中指定所有 jar,并在 weblogic-application.xml 中指定首选项类。这个想法是让 war 和 ear 成为同一个应用程序的一部分,以便 web 应用程序可以使用相同的类加载器(而不是使用 'prefer-web-inf-classes')

      编辑: 对于第一点,我已经验证 weblogic 忽略了 War 文件的 Manifest 文件。所以第一个溶胶不起作用。同样关于第二个 sol,如果耳朵中没有 ejb,weblogic 会盲目地忽略耳朵的清单。因此,您必须将 WAR 库移动到 APP-INF\lib 或只是 ear 的 lib 目录,并在 weblogic-application.xml 中指定首选项包 apache-commons-lang 无论如何不要认为这是一个有效的解决方案(尤其是当您不想仅仅为了它而创建耳朵时)

      【讨论】:

        【解决方案4】:

        Vicky,我遇到了和你一样的问题。对我有用的解决方案是在域下创建一个 /lib 文件夹(其中一些在 weblogic 文档中),添加您需要覆盖的任何第 3 方 JAR,然后在startWeblogic.cmd 文件中的 PRE_CLASSPATH 变量。

        就我而言,weblogic 有一个旧版本的 commons-lang,这导致了冲突。 因为我没有 EAR 部署,所以 weblogic-application.xml 解决方案是不行的。 在我将以下内容添加到我的 pre_classpath 之后 -
        设置 PRE_CLASSPATH=%PRE_CLASSPATH%;%DOMAIN_HOME%/lib/commons-lang-2.5.jar;

        我的问题已经解决了。

        【讨论】:

        • 感谢 Daranha,这是我们使用的解决方案之一。但我们不想在 pre_classpath 变量中定义它,因为它适用于 weblogic 应用服务器中显示的所有应用程序。
        猜你喜欢
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 2012-06-27
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        相关资源
        最近更新 更多