有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

osgi在Java中访问一个包的多个版本

我们有几个应用程序使用ApacheHttpClient 3发出HTTP请求。最近,我们还开始创建基于各种原因使用HTTPClient 4的web服务客户端。Apache的立场是“主要版本不向后兼容”。虽然我很想更新我们所有的项目以使用版本4,但这根本不可行

所以,虽然我的主要问题相当笼统,但我的特殊问题是如何在同一应用程序中使用HTTPClient版本3和4在我们的例子中,应用程序可以是web、桌面或命令行应用程序

我读过SO question for java-dynamically-load-multiple-versions-of-same-class这本书,它看起来是半封闭的,但我不太关心动态部分。事实上,我希望JAR与应用程序一起提供(例如,WEB应用程序的WEB-INF/lib),我也看到OSGi在类似于此的问题中提到了很多,但这似乎有些过分,或者可能过于复杂(也许一个简单的例子可以证明不是这样)

最后,我希望能够向团队提供一组JAR,他们可以访问这些JAR,它可以独立于使用HTTP Client 3的项目工作


共 (4) 个答案

  1. # 1 楼答案

    使用多个类加载器,每个类加载器对应于您希望使用的HTTP客户机

    最简单的方法是扩展URLClassLoader,并对其进行黑客攻击,分别对每个版本的类路径进行硬编码。然后,您只需要确保代码的其余部分知道要使用哪个版本的HTTP客户机(并访问正确的类加载器来访问它)

  2. # 2 楼答案

    一个简单而直接的解决方案是获取HttpClient3和HttpClient4的源代码,并将包名重构为

    org。阿帕奇。平民httpclient3用于httpclient3和组织。阿帕奇。平民httpclient4用于httpclient4以避免碰撞。然后编译,打包,完成

    现在很容易在这两种实现之间切换,而且它们在类加载器中不会发生冲突

  3. # 3 楼答案

    正如其他人所说,您可以创建多个类加载器,并单独加载这两个版本。这部分很简单

    问题是,这实质上分割了“类空间”,从应用程序的某些部分引用v3,同时从应用程序的其他部分引用v4仍然非常困难。你必须非常仔细地划分你的应用程序。。。那么,为什么不将其拆分并交付两个应用程序呢

    如果您能够将功能考虑到服务中,OSGi可能是一个解决方案。但是,将遗留应用程序转换为OSGi并不是一件容易的事情,而且它肯定不会是一种从您所陷入的陷阱中廉价逃脱的方法。我是作为一本关于OSGi的书的作者和一位著名的OSGi福音传道者这样说的。将应用程序转换为OSGi的长期目标将给您带来巨大的好处,但也会带来巨大的前期成本

  4. # 4 楼答案

    对于v3和v4,必须使用单独的类装入器。将v3和v4 JAR放在应用程序类路径之外的单独文件夹中。使用URLClassLoadedr加载每个版本。传递给每个类加载器的URL应该包含指向特定版本HTTP客户端的URL

    但我可以给你一个建议吗?在开始之前,先检查一下你是否真的需要这些。这是正确的,版本可能不兼容。但他们很有可能是这样的