我们正在使用基于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相同)
例外:
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)
注意:
请求OSGI专家帮助我们。
答案 0 :(得分:3)
我建议将您的依赖项放在单独的包中,并使所有包对其他包可见。然后将这些单独的包添加为依赖项(或更好:仅导入所需的包而不是整个包!)。这样,您可以确保只加载一次依赖项。我建议您当前的配置会导致类加载出现问题,因为类加载了两次,最可能是相同的serialVersionUID
。由于每个bundle都有自己的类加载器,因此第二个bundle不会看到辅助(非)加载的类。
答案 1 :(得分:0)
如果无法将JAR打包为单独的包,请指定A或B以包含所有JAR,导出所有包,并使另一个包依赖它(并从第二个包中删除JAR)。