在 Maven 中排除了依赖项的bundle中未解决的约束



我在我的osgi应用程序中使用了querydsl库。工件 querydsl-jpa 将 hibernate-jpa-2.0-api 作为依赖项。

我在我的pom中添加了这样的排除.xml因为我不使用休眠。仍然当我尝试启动我的服务(通过 karaf 功能.xml文件(时,我得到这个:

执行命令时出错:无法启动功能部件中的捆绑包 mvn:com.mysema.querydsl/

querydsl-jpa/2.5.0:捆绑包 com.mysema.querydsl.jpa [223]:无法解析 223.0:缺少要求 [223.0] 包;(&(package=org.hibernate((version>=3.6.8.Final((

MVN 项目依赖项:树不返回任何休眠依赖项。这是否意味着 osgi 依赖项完全由 querydsl bundle 的清单文件确定,即使显式排除了依赖项?

    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>2.5.0</version>
        <exclusions>
        <exclusion>
        <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
        </exclusions>
    </dependency>

以及功能摘录.xml

 <feature name='querydsl-jpa' version='2.5.0'>
  <bundle>mvn:org.apache.felix/org.osgi.compendium/1.4.0</bundle>
  <bundle>mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-core/2.5.0</bundle>
  <bundle>mvn:com.mysema.commons/mysema-commons-lang/0.2.2</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-sql/2.5.0</bundle>
  <bundle>mvn:com.mysema.querydsl/querydsl-jpa/2.5.0</bundle>
</feature>

pom.xml确定在构建时发生的情况,而不是在运行时发生的情况。很容易混淆在 pom 中声明的依赖项和在清单中声明的依赖项,因为两者似乎都涉及依赖项,但它们实际上非常不同。OSGi 运行时不知道也不关心 maven,所以它从不查看你的 pom 文件。OSGi 传达依赖关系的方式是通过清单。显然,pom 中的内容会影响清单中的内容,但仅适用于您构建的捆绑包。在这里,您不会重新生成 querydsl 捆绑包,因此清单是它附带的清单。

如果该捆绑包声明了对休眠的依赖关系,则应假定它确实需要休眠。如果确定依赖项是可选的,则应向捆绑包的所有者报告错误。在等待修复时,您的选择是重新构建捆绑包,将optional=true指令添加到休眠包,或创建一个虚拟捆绑包来导出缺少的休眠包。这将使 querydsl 捆绑包启动,但我对这种方法非常谨慎。你正在使用黑客来绕过OSGi的安全机制,并且你冒着在运行时获得NoClassDef异常和其他故障的风险,除非使用休眠的代码路径完全未使用。

最新更新