1

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

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

执行命令时出错:无法在功能 querydsl-jpa-2.5.0 中启动捆绑 mvn:com.mysema.querydsl/querydsl-jpa/2.5.0:捆绑 com.mysema.querydsl.jpa [223] 中未解决的约束:无法解析 223.0:缺少要求 [223.0] 包;(&(package=org.hibernate)(版本>=3.6.8.Final))

mvn project dependency:tree 不返回任何休眠依赖项。这是否意味着即使明确排除了依赖项,osgi 依赖项也仅由 querydsl 包的清单文件确定?

    <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>

以及 features.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>
4

1 回答 1

1

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

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

于 2012-05-16T17:11:45.750 回答