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

时间:2011-11-22 08:42:09

标签: spring persistence osgi equinox

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

捆绑包B:类似于捆绑包A.再次单独部署时工作

但是当两个bundle一起加载时,OSGI无法从bundle-classpath中提到的JAR加载第二个加载的bundle的类。首先加载的bundle运行正常,而第二次加载的bundle失败。

当SPRING尝试加载javax.persistence.QueryHint类时,会出现此问题。

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

使用的依赖JAR :(两个捆绑包中的JAR相同)

  • 春天:3.0.6.RELEASE JARS
  • Hibernate:3.6.7 JARS
  • Hibernate-JPA:hibernate-jpa-2.0-api-1.0.1.Final.jar

例外: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'targetDataSources' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [xxxx-EntityManager.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: interface javax.persistence.QueryHint is not visible from class loader at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)

注意:

  • 两个捆绑包都经过单独测试并且工作正常
  • 我们知道,我们可以在bundle之外提取第三方JAR而不是创建Bundle-classpath,而是使用import-package。但是对于当前的要求,我们只需要父包内的第三方JAR。

请求OSGI专家帮助我们。

2 个答案:

答案 0 :(得分:3)

我建议将您的依赖项放在单独的包中,并使所有包对其他包可见。然后将这些单独的包添加为依赖项(或更好:仅导入所需的包而不是整个包!)。这样,您可以确保只加载一次依赖项。我建议您当前的配置会导致类加载出现问题,因为类加载了两次,最可能是相同的serialVersionUID。由于每个bundle都有自己的类加载器,因此第二个bundle不会看到辅助(非)加载的类。

答案 1 :(得分:0)

如果无法将JAR打包为单独的包,请指定A或B以包含所有JAR,导出所有包,并使另一个包依赖它(并从第二个包中删除JAR)。