覆盖 Class 加载程序 "Parent First"
Override Class loader "Parent First"
我在 Web 应用程序服务器单节点设置上有 Java Web 应用程序 运行,我在其中使用我包含在我的 Web-Inf 中并在我的代码中使用的库。
问题是我有另一个应用程序将其库添加到 WebSphere 父库文件夹中,其中一个与我正在使用的库相同,但使用的是旧版本,造成冲突并干扰我的代码。
服务器 class 加载器首先配置为 Parent 不幸的是,我无法改变这个事实。我的问题是,如何让我的应用程序使用我的库,而忽略 class 加载器使用的库?
如果您不能更改应用程序服务器设置,基本上可以做三件事:
将您的应用程序依赖性降级到 WebSphere 服务器使用的较低版本并保持同步。这是更可取的,因为它最不麻烦。
将构建过程中的依赖隐藏到您自己的包中,以防止包冲突。这可以通过 Maven Shade Plugin, see Relocating Classes 用法示例来完成。
编写新的自定义类加载器来解决该问题。
我会按照 1 -> 2 -> 3 的顺序尝试它们。选项 3 是可能的,但它是一个容易出错的噩梦。我宁愿部署到另一台服务器也不愿这样做。
解决方案是将冲突包移动到共享库,配置库以使用独立的 class 加载器,并将该库与您的应用程序或模块相关联。 "isolated class loader" 设置为共享库创建一个单独的父最后一个 class 加载器,因此您可以将该行为仅针对需要它的工件,而不必将其应用于整个应用程序或模块。
我特指 "Use an isolated class loader for this shared library" 设置。
我在 Web 应用程序服务器单节点设置上有 Java Web 应用程序 运行,我在其中使用我包含在我的 Web-Inf 中并在我的代码中使用的库。
问题是我有另一个应用程序将其库添加到 WebSphere 父库文件夹中,其中一个与我正在使用的库相同,但使用的是旧版本,造成冲突并干扰我的代码。
服务器 class 加载器首先配置为 Parent 不幸的是,我无法改变这个事实。我的问题是,如何让我的应用程序使用我的库,而忽略 class 加载器使用的库?
如果您不能更改应用程序服务器设置,基本上可以做三件事:
将您的应用程序依赖性降级到 WebSphere 服务器使用的较低版本并保持同步。这是更可取的,因为它最不麻烦。
将构建过程中的依赖隐藏到您自己的包中,以防止包冲突。这可以通过 Maven Shade Plugin, see Relocating Classes 用法示例来完成。
编写新的自定义类加载器来解决该问题。
我会按照 1 -> 2 -> 3 的顺序尝试它们。选项 3 是可能的,但它是一个容易出错的噩梦。我宁愿部署到另一台服务器也不愿这样做。
解决方案是将冲突包移动到共享库,配置库以使用独立的 class 加载器,并将该库与您的应用程序或模块相关联。 "isolated class loader" 设置为共享库创建一个单独的父最后一个 class 加载器,因此您可以将该行为仅针对需要它的工件,而不必将其应用于整个应用程序或模块。
我特指 "Use an isolated class loader for this shared library" 设置。