什么是类装入器中的捆绑资源路径?如何访问该路径?



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

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 框架类装入器的条目。 该编号映射到 OSGi 配置中的捆绑包编号,您可以通过打开 OSGi 控制台(从 WAS_HOME/bin 目录,osgiConsole.sh|bat -server <servername>(并运行"ss"命令来找到该编号,该命令列出了捆绑包及其状态和数字 ID。

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

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

最新更新