Java Hibernate和Apache Felix的依赖链冲突
我理解OSGi抱怨多个依赖链的概念——一个包不止一次可用,而且导入包没有明确指定它需要的版本,因此OSGi容器可能会遇到不知道提供什么的麻烦 不幸的是,我本周遇到了这样一个问题,但涉及的两个捆绑包都是第三方捆绑包,因此我无法真正影响它们的导入和导出。以下是我收到的两条错误消息:Java Hibernate和Apache Felix的依赖链冲突,java,hibernate,osgi,dependency-management,apache-felix,Java,Hibernate,Osgi,Dependency Management,Apache Felix,我理解OSGi抱怨多个依赖链的概念——一个包不止一次可用,而且导入包没有明确指定它需要的版本,因此OSGi容器可能会遇到不知道提供什么的麻烦 不幸的是,我本周遇到了这样一个问题,但涉及的两个捆绑包都是第三方捆绑包,因此我无法真正影响它们的导入和导出。以下是我收到的两条错误消息: org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.hibernate
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)
当我尝试从已安装的捆绑包中删除com.springsource.javax.xml.stream
时,com.springsource.org.dom4j
抱怨缺少包javax.xml.stream
我检查了org.apache.felix.framework
的MANIFEST.MF
文件,因为我对felix显然导出javax.xml.stream
感到非常惊讶,但它没有包含这样的条目。另外,dom4j
捆绑包不会根据其清单重新导出流媒体包
如果有任何提示能让我更接近于回答这个依赖链问题的来源,我将不胜感激。从我的角度来看,除了导出所述包之外,我找不到任何包-如果包在包中以及bpot类路径(JDK)中可用,这通常是一个问题。如果该包是从另一个JDK包连接的,并且是直接从一个捆绑包连接的,那么这将是一个更大的问题。在您的情况下,问题如下:
- 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
另一方面,hibernate.core直接连接到javax.xml.stream。可能它甚至在importpackage部分使用了一个版本,因此它无法连接到来自JDK的包
我们有连锁店:
hibernate.core -> javax.xml.transform.stax -> javax.xml.stream
hibernate.core -> javax.xml.stream
这就产生了冲突。由于hibernate.core在javax.xml.transform.stax的帮助下使用javax.xml.stream API,hibernate.core和javax.xml.transform.stax应该使用相同的javax.xml.stream类。然而,他们没有
您有两种解决问题的方法:
您可以安装包含javax.xml.transform.stax包的捆绑包。该包将能够连接到来自捆绑包的javax.xml.stream包,并且hibernate.core可以连接到包含javax.xml.transform.stax的捆绑包。你可以祈祷接线永远正常
根据我的经验,框架启动后接线良好。由于捆绑包中的软件包版本较高,因此当从其他捆绑包导入软件包时,它们将是首选。但是,当bundle在运行时被更新和刷新时,连接经常出错。我不知道为什么,它只是发生了
为了避免每一个问题,我通常从引导类路径中排除那些包,这些包也可以在bundle中使用
下一个问题可能是这些API经常使用工厂类。当有人使用这样的工厂时,工厂类的类加载器也必须看到实现类。我创建了一个包含所有xmlcommons包的。它包含所有XMLAPI类及其实现(xerces、xalan等)。这可能对你有帮助。如果这个包解决了你的问题,请告诉我。在这种情况下,我将花时间收集所有必要的数据(许可进入pom,来源),并将其发布到maven central,这样它也可以帮助其他人。嗨,Balazs,感谢您的详细回答。这有助于点燃事业。我尝试为javax.xml.transform.stax安装一个包,但这只会导致下一个包出现问题,并越来越多地破坏我的依赖关系。由于框架可能永远不会在运行时看到捆绑包更新,因此解决方案已经足够好了您能否提供关于如何从类路径中排除包的更多信息?我可以通过代码或是一些启动配置来完成吗?这是一个启动配置,您可以通过系统属性来完成。遗憾的是,您不能进行排除,但可以定义引导类路径的内容。如果您使用felix,请参阅位于的“org.osgi.framework.system.packages”系统属性。只要您在这里列出您从JDK使用的每个包,该值就会非常长。一个例子是在好的。。。我以前见过这种情况,但我的某些方面希望你能在某个地方找到更好的解决方案;)但最终重要的是,这解决了问题:)我将深入研究捆绑包的依赖性,有时可能会清理一下包的混乱,但至少它可以作为一个开始,所以非常感谢!--在我忘记之前,你的包裹看起来真的很酷!由于政策限制,我不能在我的项目中使用它,但我相信它会帮助很多人。