春季-即使所需的JAR位于Bundle-classpath中,OSGI类也不可见

我们正在使用基于Equinox的OSGI框架来运行多个包.
我们的捆绑软件在Bundle-classpath中具有依赖的JAR,并且依赖的JAR与其余的类和资源一起打包在一个JAR / WAR文件中.
但是,在运行多个此类捆绑包时我们遇到了问题.
说,
套件A:经过全面测试/工作的JAR套件.包含捆绑软件类路径中的所有从属JAR,以及其中的所有从属JAR(在名为lib的文件夹下).通过仅部署此捆绑包进行测试时可以正常工作

捆绑软件B:与捆绑软件A类似.单独部署时再次工作

但是,当两个捆绑软件一起加载时,OSGI无法从第二次加载的捆绑软件的捆绑软件类路径中提到的JAR中加载类.首先加载的捆绑包运行正常,而第二次加载的捆绑包失败.

当前在SPRING尝试加载javax.persistence.QueryHint类时发生此问题.

我们使用xxxx-EntityManager.xml创建数据源,并在其中创建EntityManagerFactory

使用的从属JAR :(两个捆绑包中的相同JAR)

>春季:3.0.6.释放JARS
>休眠:3.6.7 JARS
> Hibernate-JPA:hibernate-jpa-2.0-api-1.0.1.Final.jar

例外:
PropertyAccessException 1:org.springframework.beans.MethodInvocationException:属性’targetDataSources’抛出异常;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建类路径资源[xxxx-EntityManager.xml]中定义的名称为’entityManagerFactory’的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:接口javax.persistence.QueryHint从类加载器中不可见
    在org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    在org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)

注意:

>两个捆绑包都经过单独测试,工作正常
>我们知道,除了创建Bundle-classpath之外,我们还可以在捆绑软件之外提取第三方JAR,并使用import-package.但是对于此当前要求,我们仅需要父捆绑包内的第三方JAR.

要求OSGI专家请帮助我们.

最佳答案
我建议将您的依赖项放在单独的捆绑软件中,并使所有软件包对其他捆绑软件可见.然后将这些单独的捆绑软件添加为依赖项(或更好的选择:仅导入所需的软件包,而不导入整个捆绑软件!).这样,您可以确保依赖项仅加载一次.我建议您当前的配置会导致类加载中的问题,因为类两次加载时可能使用了相同的serialVersionUID.而且由于每个捆绑包都有自己的类加载器,因此第二个捆绑包将看不到次要(未加载)的类.

转载注明原文:春季-即使所需的JAR位于Bundle-classpath中,OSGI类也不可见 - 代码日志