覆盖类加载器“父级优先”

时间:2018-11-19 16:51:03

标签: java java-ee websphere classloader

我有一个Java Web应用程序在Web应用程序服务器单节点设置上运行,其中使用的是我包含在Web-Inf中的库,并在我的代码中使用。

问题是,我有另一个应用程序将其库添加到WebSphere父库文件夹中,其中一个与我正在使用的库相同,但是版本较旧,这会导致冲突并阻塞我的代码。

首先将服务器类加载器配置为父级,但我无法更改该事实。我的问题是,如何让我的应用使用我的库,而忽略类加载器所使用的库?

2 个答案:

答案 0 :(得分:10)

解决方案是将有冲突的程序包移至共享库,将库配置为使用隔离的类加载器,然后将该库与您的应用程序或模块相关联。 “ isolated class loader”设置为共享库创建了一个单独的parent-last class loader,因此您可以将行为仅针对需要它的工件,而不必将其应用于整个应用程序或模块。

https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tcws_sharedlib.html

我专门引用“为此共享库使用隔离的类加载器”设置。

答案 1 :(得分:2)

如果您无法更改应用程序服务器设置,则基本上可以做三件事:

  1. 将您的应用程序依赖项降级为WebSphere服务器使用的较低版本,并使其保持同步。这是最好的,因为它麻烦最少。

  2. 在构建过程中将依赖项着色到您自己的软件包中,以防止软件包冲突。这可以通过Maven Shade Plugin完成,请参见Relocating Classes使用示例。

  3. 编写一个新的自定义类加载器来解决此问题。

我会按1-> 2-> 3的顺序尝试。选项3是可能的,但却是容易出错的噩梦。我宁愿部署到另一台服务器,也不要这样做。