在运行时通过java加载两个不同版本的JAR

在运行时通过java加载两个不同版本的JAR,java,classloader,Java,Classloader,我正在从事一个项目,其中使用POI 2.5版本jar的功能很少,我已经开发了一个新功能,我需要POI 3.10版本jar,因此现在的问题是以前的功能无法正常工作,因为它在POI 2.5版本jar上工作得很好 现在,如果我在我的类路径中保留两个版本的poi JAR,是否有任何方式可以仅为我的类显式调用poi 3.10版本,并且为之前的功能调用poi 2.5版本 默认情况下,如果我保留两个版本的poi jar,那么调用总是在poi 2.5版本的jar中进行,因此我希望我的类明确地说调用了类abc p

我正在从事一个项目,其中使用POI 2.5版本jar的功能很少,我已经开发了一个新功能,我需要POI 3.10版本jar,因此现在的问题是以前的功能无法正常工作,因为它在POI 2.5版本jar上工作得很好

现在,如果我在我的类路径中保留两个版本的poi JAR,是否有任何方式可以仅为我的类显式调用poi 3.10版本,并且为之前的功能调用poi 2.5版本

默认情况下,如果我保留两个版本的poi jar,那么调用总是在poi 2.5版本的jar中进行,因此我希望我的类明确地说调用了类abc poi 3.10版本

请告知我是否可以在这里显式地使用类加载器,还请告知我是否可以动态地创建类的对象

class ABC 
{

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

}
使用POI 2.5早期版本的def类

class DEF
{

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

}

是的,可以这样做,从不同的类加载器加载每个jar

  • 将两个JAR从当前类路径移出
  • 为每个jar创建一个URLClassLoader,将实际的类加载器作为父类
  • 使用反射处理POI

  • 您还可以重构JAR中的一个,以更改其包并避免冲突。如果您将maven与一起使用,这可以自动完成。

    这不容易做到。例如,可以使用OSGi来完成,但这并不简单。修改代码可能会更容易,因此它只需要一个版本的POI,而不是同时需要两个版本。请告知java中没有任何方法。同时请告知如何通过OSGit实现此功能。此功能可以帮助您:您完全可以使用,但这不是一个非常干净的方法,你可能会遇到一些意想不到的问题。(特别是关于类加载器层次结构和谁先加载类。)感谢请求您展示我们如何使用实际的类加载器作为父级创建url类加载器,然后提前使用g反射