Dependencies maven中排除了依赖项的捆绑包中未解析的约束

Dependencies maven中排除了依赖项的捆绑包中未解析的约束,dependencies,osgi,apache-karaf,querydsl,Dependencies,Osgi,Apache Karaf,Querydsl,我在osgi应用程序中使用querydsl库。工件querydsl jpa具有hibernate-jpa-2.0-api作为依赖项 因为我不使用hibernate,所以我在pom.xml中添加了这样一个排除项。但当我尝试启动我的服务(通过karaf features.xml文件)时,我得到了以下信息: 执行命令时出错:无法启动bundle mvn:com.mysema.querydsl/querydsl jpa/2.5.0功能中的querydsl-jpa-2.5.0:bundle com.mys

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

因为我不使用hibernate,所以我在pom.xml中添加了这样一个排除项。但当我尝试启动我的服务(通过karaf features.xml文件)时,我得到了以下信息:

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

mvn项目依赖关系:树不返回任何hibernate依赖关系。这是否意味着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>

com.mysema.querydsl
querydsl jpa
2.5.0
org.hibernate.javax.persistence
hibernate-jpa-2.0-api
以及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>

mvn:org.apache.felix/org.osgi.compendium/1.4.0
mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1
mvn:com.mysema.querydsl/querydsl-core/2.5.0
mvn:com.mysema.commons/mysema commons lang/0.2.2
mvn:com.mysema.querydsl/querydsl-sql/2.5.0
mvn:com.mysema.querydsl/querydsl-jpa/2.5.0

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


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

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


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

谢谢。我很害怕。我真的不想把hibernate包含在我的包中,所以我想我会和querydsl的人谈谈(或者停止使用它),他们最近解决了这个问题。所以下一个版本应该没问题:谢谢。我很害怕。我真的不想把hibernate包含在我的包中,所以我想我会和querydsl的人谈谈(或者停止使用它),他们最近解决了这个问题。因此,下一个版本应该可以: