java - Hibernate 和 Apache Felix 的依赖链冲突

标签 java hibernate osgi dependency-management apache-felix

我理解 OSGi 提示多个依赖链的概念 - 一个包可以多次使用,并且当导入包没有准确指定它需要哪个版本时,因此 OSGi 容器可能会遇到不知道什么的麻烦提供。

不幸的是,我本周遇到了这样的问题,但涉及的两个 bundle 都是第三方 bundle ,因此我无法真正影响它们的导入和导出。这是我收到的两条错误消息:

org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.hibernate.core [28.0] because it is exposed to package 'javax.xml.stream' from bundle revisions com.springsource.javax.xml.stream [23.0] and org.apache.felix.framework [0] via two dependency chains.

Chain 1:
  org.hibernate.core [28.0]
    import: (osgi.wiring.package=javax.xml.stream)
     |
    export: osgi.wiring.package=javax.xml.stream
  com.springsource.javax.xml.stream [23.0]

Chain 2:
  org.hibernate.core [28.0]
    import: (osgi.wiring.package=javax.xml.transform.stax)
     |
    export: osgi.wiring.package=javax.xml.transform.stax; uses:=javax.xml.stream
    export: osgi.wiring.package=javax.xml.stream
  org.apache.felix.framework [0]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3824) 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
    at java.lang.Thread.run(Thread.java:724)



org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.hibernate.core [28.0] because it is exposed to package 'javax.xml.stream' from bundle revisions org.apache.felix.framework [0] and com.springsource.javax.xml.stream [23.0] via two dependency chains.

Chain 1:
  org.hibernate.core [28.0]
    import: (osgi.wiring.package=javax.xml.stream)
     |
    export: osgi.wiring.package=javax.xml.stream
  org.apache.felix.framework [0]

Chain 2:
  org.hibernate.core [28.0]
    import: (osgi.wiring.package=org.dom4j.io)
     |
    export: osgi.wiring.package=org.dom4j.io; uses:=javax.xml.stream
  com.springsource.org.dom4j [27.0]
    import: (&(osgi.wiring.package=javax.xml.stream)(version>=1.0.1)(!(version>=2.0.0)))
     |
    export: osgi.wiring.package=javax.xml.stream
  com.springsource.javax.xml.stream [23.0]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3824)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
    at java.lang.Thread.run(Thread.java:724)

当我尝试从已安装的 bundle 中删除 com.springsource.javax.xml.stream 时,com.springsource.org.dom4j 提示缺少包 javax .xml.stream.

我检查了 org.apache.felix.frameworkMANIFEST.MF 文件,因为我对 Felix 明显导出 javax.xml.stream< 感到非常惊讶,但它不包含这样的条目。此外,dom4j bundle 不会根据其 list 重新导出流包。

如果有任何提示可以让我更接近地回答这个依赖链问题的根源,我将非常感激。从我的角度来看,除了导出所述包的 com.springsource.javax.xml.stream 之外,我找不到 bundle -

最佳答案

如果包在 bundle 中以及 bpot 类路径 (JDK) 中可用,这通常是一个问题。如果该包是从另一个 JDK 包以及直接从 bundle 连接的,那就是一个更大的问题。对于您的情况,问题如下:

  • javax.xml.transform.stax 仅在引导类路径 (JDK) 上可用,因此 hibernate.core 连接到该包。
  • 由于 javax.xml.transform.stax 来自引导类路径,因此它可以连接到引导类路径上的另一个包。它需要 javax.xml.stream,因此它将连接到来自 JDK 的包

我们有链条:

hibernate.core -> javax.xml.transform.stax -> javax.xml.stream

另一方面,hibernate.core 直接连接到 javax.xml.stream。可能它甚至使用了 Import-Package 部分中的版本,因此它无法连接到来自 JDK 的包。

我们有链条:

hibernate.core -> javax.xml.stream

这会产生冲突。由于 hibernate.core 在 javax.xml.transform.stax 的帮助下使用 javax.xml.stream API,hibernate.core 和 < em>javax.xml.transform.stax应该使用与javax.xml.stream相同的类。然而,他们没有。

您有几个选项可以解决您的问题:

您可以安装包含 javax.xml.transform.stax 包的 bundle 。该包将能够连接到来自 bundle 的 javax.xml.stream 包,并且 hibernate.core 也可以连接到包含 javax.xml.transform.stax 的 bundle /em>.您可以祈祷接线永远没问题。

根据我的经验,框架启动后线路就很好了。由于 bundle 中的软件包版本较高,因此从其他 bundle 导入软件包时将优先选择它们。然而,当包在运行时更新和刷新时,接线经常会出错。我不知道为什么,它就这样发生了。

为了避免出现每个问题,我通常会从引导类路径中排除这些包,这些包也可以在 bundle 中使用。

您的下一个问题可能是这些 API 经常使用工厂类。当有人使用这样的工厂时,工厂类的类加载器也必须看到实现类。我创建了一个bundle包含所有 xmlcommons 包。它包含所有 xml-apis 类及其实现(xerces、xalan 等)。这可能对你有帮助。如果此 bundle 解决了您的问题,请告诉我。在这种情况下,我最终会花时间收集所有必要的数据(授权到 pom、源)并将其发布到 maven-central,这样它也可以帮助其他人。

关于java - Hibernate 和 Apache Felix 的依赖链冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23495147/

相关文章:

Java将新文件的数据附加到旧文件

java - Maven 调用者跳过目标中的测试

java - 虽然有 Composite Primary Key,但 Hibernate 在只有一个键唯一时报错

spring - Camel , Spring ,OSGI : Is there a way to specify the stop method?

java - OSGI 环境中的 Spring 应用程序

java - 按数组升序选择排序

java - 是否可以使用 pack200 创建可执行 jar?

java - Spring HibernateDaoSupport 保持相同的 session ?

java - Spring JPA @NotNull 和 @JsonIgnore

osgi - 如何在基于功能的 eclipse rcp 应用程序中自动启动 org.eclipse.gemini.blueprint.extender?