class 加载程序中的包资源路径是什么?我如何访问该路径?

What is a bundle resource path in class loader? How do I access that path?

我有一个部署到 Websphere 的 Web 应用程序,发现有一些冲突的 jar。为了找到冲突的路径 class 我添加了以下代码

ClassLoader classLoader = MyClass.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/conn/ssl/AllowAllHostnameVerifier.class");
System.out.println(resource);

当我检查 IBM System.out 日志文件时,我看到了以下资源路径。我不确定捆绑资源路径是什么。我想知道如何访问以下位置?

bundleresource://85.fwk734572965/org/apache/http/conn/ssl/AllowAllHostnameVerifier.class

"bundleresource" URL 表示来自 OSGi 框架 class 加载程序的条目。该数字映射到 OSGi 配置中的捆绑包编号,您可以通过打开 OSGi 控制台(从 WAS_HOME/bin 目录,osgiConsole.sh|bat -server <servername>)和 运行 "ss" 找到它命令,其中列出了捆绑包及其状态和数字 ID。

假设您在运行时通过 class 加载看到冲突(实际上不是通过 getResource 引入这些 classes),我可以相当肯定地说您正在选择从 JAX-RS prereq jar WAS_HOME/plugins/com.ibm.ws.prereq.jaxrs.jar 中提取冲突的 classes。在发布时,该 jar 使其 Apache HTTP 副本对应用程序可见。如果您能够将您的安装修补到最新的服务级别,则该可见性已在以后的修复包中删除。

请注意,即使您使用该修复程序移动到较新的修复包,您的测试用例可能仍会显示相同的内容 - 我认为 getResource() 不会受到与 [=13] 相同的过滤=],因此您仍然可以通过这种方式访问​​ .class 文件。不过,它可能有助于解决您在运行时遇到的问题。