【问题标题】:Tricky Classpath issue棘手的类路径问题
【发布时间】:2015-03-03 22:29:56
【问题描述】:

在现有应用程序上工作,它在 Weblogic 上作为一个巨大的 ear 文件运行。

我的组织编写的自定义代码以及供应商编写的代码都在 weblogic 启动时在一个类路径上运行。

我们的一些自定义代码使用spring 1.2,在最新版本的供应商代码中,他们使用spring3。所以我们无法让耳朵完全工作,除非我们能够为每个组件获取它需要的弹簧版本才能运行。但由于它们都使用启动 weblogic 的类路径,因此 spring1.2 或 spring 3.0 将首先取决于类路径中的顺序。

我卡住了吗?遗漏了什么?我从来不用在这个级别处理类路径。

谢谢

【问题讨论】:

    标签: java jar classpath weblogic-10.x


    【解决方案1】:

    类加载器在加载类时使用委托模型。类加载器实现首先检查其缓存以查看请求的类是否已经加载。这种类验证提高了性能,因为它使用缓存的内存副本而不是从磁盘重复加载类。如果在其缓存中找不到该类,则当前类加载器向其父类请求该类。只有当父级无法加载类时,类加载器才会尝试加载类。如果父类加载器和子类加载器中都存在一个类,则加载父版本。遵循此委托模型以避免加载同一表单的多个副本。同一类的多个副本可能导致 ClassCastException。

    认为在 weblogic.xml 中设置以下内容可能会有所帮助

    prefer-web-inf-classes 元素

    weblogic.xml Web 应用程序部署描述符包含一个 prefer-web-inf-classes 元素(该元素的子元素)。默认情况下,此元素设置为 False。将此元素设置为 True 会破坏类加载器委托模型,以便 Web 应用程序中的类定义优先于更高级别的类加载器中的类定义加载。这允许 Web 应用程序使用它自己的第三方类版本,它也可能是 WebLogic Server 的一部分。请参阅“weblogic.xml 部署描述符元素”。*

    使用此功能时,您必须注意不要将根据 Web 应用程序的类定义创建的实例与根据服务器定义创建的发布混为一谈。如果此类实例混合在一起,则会导致 ClassCastException。

    参考以下网址

    Oracle Weblogic Server

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2013-02-08
      相关资源
      最近更新 更多