Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OSGi:javax.annotation冲突:JavaSE与JavaEE_Java_Maven_Jakarta Ee_Osgi_Cdi - Fatal编程技术网

OSGi:javax.annotation冲突:JavaSE与JavaEE

OSGi:javax.annotation冲突:JavaSE与JavaEE,java,maven,jakarta-ee,osgi,cdi,Java,Maven,Jakarta Ee,Osgi,Cdi,在JavaSEOSGi(ApacheFelix)环境中,我尝试使用PaxCDI和Weld 2.2.6.Final集成CDI 我当前遇到以下错误: ERROR: Bundle org.jboss.weld.osgi-bundle [45] Error starting file:///someDir/org/jboss/weld/weld-osgi-bundle/2.2.6.Final/weld-osgi-bundle-2.2.6.Final.jar (org.osgi.framework.Bun

在JavaSEOSGi(ApacheFelix)环境中,我尝试使用PaxCDI和Weld 2.2.6.Final集成CDI

我当前遇到以下错误:

ERROR: Bundle org.jboss.weld.osgi-bundle [45] Error starting file:///someDir/org/jboss/weld/weld-osgi-bundle/2.2.6.Final/weld-osgi-bundle-2.2.6.Final.jar (org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.jboss.weld.osgi-bundle [45.0] because it is exposed to package 'javax.annotation' from bundle revisions org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0] and org.apache.felix.framework [0] via two dependency chains.

Chain 1:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=javax.annotation)(version>=1.1.0))
     |
    export: osgi.wiring.package=javax.annotation
  org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0]

Chain 2:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=com.google.common.util.concurrent)(version>=13.0.0))
     |
    export: osgi.wiring.package=com.google.common.util.concurrent; uses:=javax.annotation
  com.google.guava [1.0]
    import: (osgi.wiring.package=javax.annotation)
     |
    export: osgi.wiring.package=javax.annotation
  org.apache.felix.framework [0])
我认为这是因为JavaSE(v8)已经定义了一个包“javax.annotation”,但JavaEE(v7)用更多注释指定了同一个包

然而,“javax.annotation”已经作为系统包由系统包导出(org.apache.felix:org.apache.felix.framework:jar:4.2.1)

在这种情况下,让OSGi从JavaEE中选择的正确方法是什么

编辑

  • 仅添加JDK真正需要的系统包

    在本例中,这是不可能的,因为我正在编写一个框架,而不是一个应用程序()

  • 在default.properties中从org.osgi.framework.system.packages系统属性中排除javax.annotations

    实际上,我已经尝试过了,因为我在框架中有一个default.properties的副本。它工作了,但它看起来更像是一个黑客,当我需要升级这个文件时,它增加了维护工作。此外,如果Maven Bundle插件在编译时检查导出的包(我很欢迎),那么当人们想要使用javax.annotations时,他们必须开始向他们的项目添加额外的依赖项,因为该包将由系统包导出。 我希望找到更好的解决办法

  • 使用认可的mechansim

    这看起来是迄今为止最干净的解决方案,但我仍然希望能够避免,因为它增加了应用程序打包的复杂性

  • 现在,我刚刚查看了JavaSE8文档,很惊讶JSR250不再被列为认可的技术!???它被列为JavaSE7中认可的技术。他们真的删除了JavaSE8中对JSR250的支持吗?还是文档不正确

    Java SE 8:

    Java SE 7:

    如果JavaSE8仍然支持它,您对这种方法有何看法


    还有其他方法吗?

    Java的一个大问题是,越来越多的包被放入JDK中,而JDK应该是独立的项目,具有自己的版本控制生命周期。这不会在单一宗教项目中造成问题,但会在OSGi中造成痛苦

    这就是为什么我们只添加JDK中真正需要的系统包,而我们从bundle中获得了一切。您会惊讶于您实际上需要从JDK获得多少软件包

    如果有一个org.osgi.framework.system.packages.exclude系统属性,但遗憾的是它不存在,则可以快速修复

    一个缓慢的解决方案是,如果您指定org.osgi.framework.system.packages,而不指定任何包,然后逐个找到您实际需要的包。你会惊讶于你所需要的软件包是多么少

    一个更快但更脏的解决方案是,如果进入felix.jar,找到default.properties并复制org.osgi.framework.system.packages系统属性的内容,而不包括javax.annotation.*类。当您意识到javax.transaction.*包也会有同样的问题时,作为结果,您需要从包中获取javax.sql.*包


    不幸的是,在felix中,您必须同时在系统包列表中列出osgi核心包。对于Equinox,这些软件包不必列出(我认为这很好,因为osgi核心软件包不应该是系统软件包配置的一部分)。

    谢谢您的回答。请看我更新的问题。