首页 > 解决方案 > 使用约束冲突。无法解析资源 -javax.xml.bind.annotation 和 jakarta.xml.bind-api

问题描述

我搜索了一个looooot,但找不到解决我问题的方法。

我正在使用 osgi、karaf 和 java 8。

我有一些模块,例如:

这个模块中的 WEBSERVICE-Something 可以说 API、持久性、适配器

持久性和 api 启动正常,但适配器给出了该错误:

Uses constraint violation. Unable to resolve resource adapter [adapter [288](R 288.2)] 
because it is exposed to package 'javax.xml.bind.annotation' from resources 
org.apache.felix.framework [org.apache.felix.framework [0](R 0)] and 
jakarta.xml.bind-api [jakarta.xml.bind-api [79](R 79.0)] via two dependency 
chains.

链在适配器和 api 中。

但是,这是什么意思?

我可以将它作为功能安装,它们都会启动,但我的另一个捆绑包将放在 GracePeriod 上,如果我在 karaf 上进行 DIAG,它会说:

Status: GracePeriod
Declarative Services
Blueprint
01/09/19 19:00
Missing dependencies:
(&(osgi.unit.name=example_db)(objectClass=javax.persistence.EntityManager))

请注意,我还有其他 web 服务模块,其中一些工作正常,我检查了 pom,它们具有相同的依赖项和相同的版本

数据源也很好,我已经尝试添加一些功能,如 hibernate.entityManager 但它不起作用。

标签: javaosgiapache-karaf

解决方案


根据您提供的有限信息,您很可能在运行时有由不同捆绑包导出的同一包的两个版本。

这本身不是问题,但正如本答案中所解释的,它会导致错误

  • bundleA需要来自的包B和来自的包C
  • bundleB需要不同版本的相同包C

在您的特定情况下,有问题的包似乎是javax.xml.bind.annotation通过 org.apache.felix.frameworkbundle 和jakarta.xml.bind-apibundle 以 2 个不同版本导出的。

如果不知道您尝试安装的捆绑软件的确切要求和功能是什么,很难说解决这个问题的最佳方法是什么。

更新:

以下是一些可用于调试情况的方法:

  • 调用package:exports | grep javax.xml.bind.annotation会告诉你哪些包以什么版本导出包
  • 调用package:imports | grep javax.xml.bind.annotation会告诉你哪些包以什么版本导入包
  • 致电bundle:diag <YOUR_BUNDLE_ID>将为您提供捆绑未解决的详细信息

推荐阅读