Java 类路径中的类干扰OSGi捆绑包
我正在编写一个OSGi包,我们称之为B,它将部署在现有应用程序中。捆绑包需要访问库L(即JasperReport),版本V2 这样的库位于应用程序的类路径中,不是作为OSGi包,而是版本为Java 类路径中的类干扰OSGi捆绑包,java,jasper-reports,osgi,classloader,apache-felix,Java,Jasper Reports,Osgi,Classloader,Apache Felix,我正在编写一个OSGi包,我们称之为B,它将部署在现有应用程序中。捆绑包需要访问库L(即JasperReport),版本V2 这样的库位于应用程序的类路径中,不是作为OSGi包,而是版本为V1
V1
我尝试了两种情况:
B.jar
中有一份库的L.jar
,
并将其包含在包类路径中
李>
L-OSGi.jar
,使用bnd
,在所有导出包中指定导出的版本为V2,将其与我自己的捆绑包一起部署,并在后者的导入包中明确要求V2版本
清单
中的导入包
头中特别需要的包
但是,我得到了这个错误:
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-你能解决这个问题吗?