罐子冲突问题

Jar conflict issue

我正在使用 aws sdk 包从部署在 websphere 应用程序中的 web 应用程序访问 aws api。在构建期间,应用程序不会引发任何编译时问题。部署后它抛出 java.lang.NoSuchFieldError: org/apache/http/conn/ssl/AllowAllHostnameVerifier.INSTANCE

我读了一些post,它说的是 jar 冲突。它采用 IBM 的默认 httpclient jar。我想指出我的代码采用我在 lib 文件夹中提供的 httpclient 版本。有人可以帮我指出我的代码来选择我手动添加的 jars 版本吗?

为了让您的应用程序使用服务器中包含的内容的自己的版本,您需要使用父级最后 class 加载程序委派。假设 Apache HTTP 客户端位于您的 Web 模块的 WEB-INF/lib 目录中,您需要对 Web 模块的 class 加载程序设置进行更改(此文档专门来自 8.5.5,但应该适用于任何过去十年左右的版本):https://www.ibm.com/docs/en/was-nd/8.5.5?topic=loading-configuring-web-module-class-loaders

请注意,parent-last 委托有其自身的风险,因为如果您尝试在您的应用程序中使用一个版本(Servlet API 是比较著名的之一)。如果您尝试此操作但 运行 进入 ClassCastExceptions 或 LinkageErrors 之类的东西,您可能希望将 HTTP 客户端放入一个隔离的共享库(选择“为此共享库使用一个隔离的 class 加载程序”选项) 并将共享库与您的 Web 模块或应用程序相关联:https://www.ibm.com/docs/en/was-nd/8.5.5?topic=servers-managing-shared-libraries

综上所述,最简单的解决方案可能就是更新您的服务器。几年前的一个 APAR(PI50993,包含在修复包 8.5.5.9 中)删除了应用程序对服务器版本的 Apache HTTP 客户端的可见性。移至最近的修复包也可能会解决该问题。