我有一个部署到Websphere的Web应用程序,发现存在一些冲突的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
答案 0 :(得分:0)
“bundleresource”URL表示来自OSGi框架类加载器的条目。该数字映射到OSGi配置中的软件包编号,您可以通过打开OSGi控制台(来自WAS_HOME / bin目录,osgiConsole.sh|bat -server <servername>
)并运行“ss”命令找到它,该命令列出了软件包以及他们的状态和数字ID。
假设你在运行时通过类加载看到了冲突(实际上并没有通过getResource引入这些类),我会非常肯定地说你正在从JAX-RS先决条件jar中获取冲突类,WAS_HOME/plugins/com.ibm.ws.prereq.jaxrs.jar
。在它发布时,该jar使其Apache HTTP副本对应用程序可见。如果您能够将安装修补到最新的服务级别,则可以在以后的修订包中删除该可见性。
请注意,即使您使用该修补程序迁移到较新的修订包,您的测试用例仍可能显示相同的内容 - 我认为getResource()
与loadClass()
的过滤相同,所以你仍然可以以这种方式获得.class文件。不过,它可能对您在运行时看到的问题有所帮助。