2016-03-03 52 views
3

我正在一个项目,其中少数功能POI 2.5版本罐子正在使用,我已经开发了一个新功能,我需要POI版本3.10罐子所以现在问题是,以前的功能是不能正常工作,因为它是完美的工作poi 2.5版本jar加载的两个不同版本的罐子在运行时通过java

现在,如果我保持在我的班级路径poi罐的两个版本是否有任何方式,只有我可以调用我的班级poi 3.10版本明确地和为以前的功能poi 2.5版本被称为

默认情况下,如果我保留poi罐的两个版本,然后始终呼叫poi 2.5版本ns的jar所以我想为我的班级说abc类明确poi 3.10版本正在调用

请指教我可以明确地在这里使用类加载器,也请指教是否有可能如果我可以动态创建类的对象

class ABC 
{ 

//version of poi 3.10 being called here 
HSSFWorkbook workbookXls = new HSSFWorkbook(); 

} 

类DEF其使用的POI 2.5

class DEF 
{ 

//version of poi 2.5 being called here 
HSSFWorkbook workbookXls = new HSSFWorkbook(); 

} 
+4

这不太容易。它可以用OSGi来完成,但这并不简单。它可能会更容易修改代码,以便它只需要一个版本的POI,而不是同时使用两个版本。 – Jesper

+0

请指教在java中没有任何方法.. – sss

+0

也请通知OSGI – sss

回答

1

是可以做到这一点早期版本,装载从不同的类加载器每个瓶中之中。

  1. 移动从当前的classpath
  2. 两个罐子出父创建为他们每个人的罐子URLClassLoader的,与你的实际的类加载器
  3. 使用反射来对付POI

你也可以重构一个罐子来改变它的包装并避免碰撞。如果你正在使用​​的maven,这可以自动完成。

+0

感谢您请求我们展示如何创建一个带有实际类加载器的url类加载器作为父类,然后使用g reflection进行感谢 – sss

相关问题