我有一个Java Web应用程序在Web应用程序服务器单节点设置上运行,其中使用的是我包含在Web-Inf中的库,并在我的代码中使用。
问题是,我有另一个应用程序将其库添加到WebSphere父库文件夹中,其中一个与我正在使用的库相同,但是版本较旧,这会导致冲突并阻塞我的代码。
首先将服务器类加载器配置为父级,但我无法更改该事实。我的问题是,如何让我的应用使用我的库,而忽略类加载器所使用的库?
答案 0 :(得分:10)
解决方案是将有冲突的程序包移至共享库,将库配置为使用隔离的类加载器,然后将该库与您的应用程序或模块相关联。 “ isolated class loader”设置为共享库创建了一个单独的parent-last class loader,因此您可以将行为仅针对需要它的工件,而不必将其应用于整个应用程序或模块。
我专门引用“为此共享库使用隔离的类加载器”设置。
答案 1 :(得分:2)
如果您无法更改应用程序服务器设置,则基本上可以做三件事:
将您的应用程序依赖项降级为WebSphere服务器使用的较低版本,并使其保持同步。这是最好的,因为它麻烦最少。
在构建过程中将依赖项着色到您自己的软件包中,以防止软件包冲突。这可以通过Maven Shade Plugin完成,请参见Relocating Classes使用示例。
编写一个新的自定义类加载器来解决此问题。
我会按1-> 2-> 3的顺序尝试。选项3是可能的,但却是容易出错的噩梦。我宁愿部署到另一台服务器,也不要这样做。