使用Java访问包的多个版本

And*_*ite 6 java osgi classloader apache-commons

我们有几个使用Apache HTTPClient 3发出HTTP请求的应用程序.最近我们也开始创建使用HTTPClient 4的Web服务客户端,原因有很多.Apache的立场是" 主要版本不向后兼容 ".虽然我希望更新所有项目以使用版本4,但这根本不可行.

所以,虽然我的主要问题相当笼统,但我的具体问题是.如何在同一个应用程序中使用HTTPClient版本3和4?在我们的示例中,应用程序可以是Web,桌面或命令行应用程序.

我已经阅读了java- dynamic -load-multiple-versions-of-same-classSO问题,这似乎是半封闭的,但我并不在乎动态部分.事实上,我希望JAR随应用程序一起提供(例如,WEB-INF/lib for web apps)我也看到OSGi在与此类似的问题中提到了很多,但它似乎有点矫枉过正或者过于复杂(也许一个简单的例子可以证明不然).

最后,我希望能够为团队提供一组他们可以投入使用的罐子,它只使用HTTP Client 3独立于他们的项目.

Nei*_*ett 6

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

问题是,这实际上拆分了你的"类空间",并且在从应用程序的其他部分引用v4时,仍然很难从应用程序的某些部分引用v3.您必须非常仔细地对应用程序进行分区...那么为什么不将它拆分并提供两个应用程序呢?

如果您能够将功能分解为服务,OSGi可能是一种解决方案.但是将遗留应用程序转换为OSGi并不是一件容易接受的事情,它肯定不会成为你走进陷阱的廉价逃脱者.我说这是一本关于OSGi和着名的OSGi布道者的书的作者.将您的应用程序转换为OSGi的长期目标将为您带来巨大的好处,但也会带来巨大的前期成本.