Java 类路径中的类干扰OSGi捆绑包

Java 类路径中的类干扰OSGi捆绑包,java,jasper-reports,osgi,classloader,apache-felix,Java,Jasper Reports,Osgi,Classloader,Apache Felix,我正在编写一个OSGi包,我们称之为B,它将部署在现有应用程序中。捆绑包需要访问库L(即JasperReport),版本V2 这样的库位于应用程序的类路径中,不是作为OSGi包,而是版本为V1

我正在编写一个OSGi包,我们称之为B,它将部署在现有应用程序中。捆绑包需要访问库L(即JasperReport),版本V2

这样的库位于应用程序的类路径中,不是作为OSGi包,而是版本为
V1

我尝试了两种情况:

  • 在我的bundle的
    B.jar
    中有一份库的
    L.jar
    , 并将其包含在
    包类路径中
  • 创建库的OSGi-fied版本
    L-OSGi.jar
    ,使用
    bnd
    ,在所有
    导出包中指定导出的版本为V2,将其与我自己的捆绑包一起部署,并在后者的
    导入包中明确要求V2版本
  • 我希望这两种方法都能起作用,因为我希望每个bundle只看到
    清单
    中的
    导入包
    头中特别需要的包

    但是,我得到了这个错误:

    Caused by: net.sf.jasperreports.engine.JRRuntimeException: Class net.sf.jasperreports.extensions.DefaultExtensionsRegistry does not implement/extend net.sf.jasperreports.extensions.ExtensionsRegistry
    
    这感觉就像是使用库的一个副本来获取基类/接口,而使用子类的另一个副本(顺便说一句,即使我捆绑了库的同一版本,也会发生这种情况)


    我将尝试导入应用程序提供的库的版本,并使用这个旧版本,但为什么会发生这种情况?我能阻止它吗?

    它应该按照您描述的方式工作。我想这是包装错误。您的bundle B从哪里获得包
    net.sf.jasperreports.extensions
    ?它是导入的,还是包含在捆绑包中?在第二个场景中导入,并包含在第一个场景中。我理解你的问题了吗?嗯,是的。这个API必须有两个副本,并且以某种方式相互干扰。这两种情况下的错误消息是否相同?你能看到哪个包抛出了错误吗?提供完整的堆栈跟踪可能会很有用。错误会回到办公室,就像堆栈跟踪一样,但除非我弄错了,否则错误是相同的,当我的包调用库时会发生错误,而不是当原始应用程序调用库时。@kenshin-你能解决这个问题吗?