Java 嵌入式Felix无法将activator强制转换为BundleActivator

Java 嵌入式Felix无法将activator强制转换为BundleActivator,java,osgi,apache-felix,Java,Osgi,Apache Felix,问题 我在Felix OSGi容器中实例化我的OSGi包激活器时遇到问题。当我尝试启动bundle时,我得到一个错误,即我无法将激活器类型强制转换为org.osgi.framework.BundleActivator,尽管在项目中父类是这样定义的 我已经将org.osgi:org.osgi.core:5.0.0包含在激活的bundle中,以便可以启动具有激活器的类。我应该需要引用OSGi包中的OSGi库,还是Felix容器应该为我提供它们 无论是运行Felix embedded还是从命令行运行,

问题

我在Felix OSGi容器中实例化我的OSGi包激活器时遇到问题。当我尝试启动bundle时,我得到一个错误,即我无法将激活器类型强制转换为org.osgi.framework.BundleActivator,尽管在项目中父类是这样定义的

我已经将org.osgi:org.osgi.core:5.0.0包含在激活的bundle中,以便可以启动具有激活器的类。我应该需要引用OSGi包中的OSGi库,还是Felix容器应该为我提供它们

无论是运行Felix embedded还是从命令行运行,我都有同样的问题

**解决方案**

事实证明,Felix中的OSGi版本比最新标准更旧。由于我是OSGi的新手,我刚刚掌握了所有最新的东西并开始开发。我已从5.0.0版移回4.3.0版。我注意到的唯一区别是API中缺少漂亮的泛型

既然我的类是兼容的,那么在容器中启动时就可以解析它们了。以前的问题只是由于库的版本

背景

我有一个Maven构建的项目没有启动,因为它找不到org.osgi.frameworkvesrion>=1.7.0的依赖项!版本>=2.0.0

项目配置为:

Main
  SubProjectApi
  SubProjectImpl
  SubProjectIntegrationTest
其中subprojectmpl依赖于SubProjectApi。SubProjectApi有一个使用maven bundle插件构建的bundle,但不包含任何OSGi引用。SubProjectMPL引用Api模块并提供BundleActivator。为了解析OSGi类,该项目依赖于org.OSGi:org.OSGi.core:5.0.0。一切都很好

project SubProjectIntegrationTest提供了一组单元测试,以确保SubProjectMPL在嵌入式Felix环境中正常工作。我按照指南设置了Felix实例,创建了激活器,引用了所需的JAR,等等。。因为测试环境和OSGi都需要相同的API类,所以我使用org.OSGi.framework.system.packages.extra配置选项来共享API类

当测试开始时,产生了以下错误

ERROR: Bundle dsto.lod.simr.core [12] 
    Error starting file:target/SubProjectImpl.jar 
    (org.osgi.framework.BundleException: Unresolved constraint in bundle
    project.impl [12]: Unable to resolve 12.0: 
    missing requirement [12.0] osgi.wiring.package; 
    (&(osgi.wiring.package=org.osgi.framework)(version>=1.7.0)(!(version>=2.0.0))))

我认为Felix环境会自动提供这些类。我将org.osgi.core模块添加到了环境中,问题变成了我在强制类型转换中遇到的问题。

您不应该安装core API包。这些包由框架实现导出。如果您安装了bundle并针对bundle进行解析,那么您的bundle和框架实现将为这些类使用不同的类对象


您还需要针对核心API的版本进行编译,该版本小于或等于框架实现支持的版本。看起来您是针对core 5.0编译的,而框架实现是针对core 4.3或5.0以下的其他版本。

您不应该安装core API捆绑包。这些包由框架实现导出。如果您安装了bundle并针对bundle进行解析,那么您的bundle和框架实现将为这些类使用不同的类对象


您还需要针对核心API的版本进行编译,该版本小于或等于框架实现支持的版本。看起来您是针对core 5.0编译的,而框架实现是针对core 4.3或5.0以下的其他版本。

我在一个基于Maven的项目中遇到了这个问题,导入似乎是正确的。问题是缓存了某个不正确的接口版本。它在清除缓存后工作

为了总是在启动时清除缓存,我使用了配置参数org.osgi.framework.Constants.framework\u STORAGE\u CLEAN:


我在一个基于Maven的项目中遇到了这个问题,其中的导入似乎是正确的。问题是缓存了某个不正确的接口版本。它在清除缓存后工作

为了总是在启动时清除缓存,我使用了配置参数org.osgi.framework.Constants.framework\u STORAGE\u CLEAN:


谢谢我开始使用org.apache.felix:org.apache.felix.main:4.0.3在Maven构建中提供OSGi组件,但不喜欢指定特定于供应商的OSGi,但是构建确实有效,组件在嵌入式felix中启动。然后我改为org.osgi:org.osgi.core:4.3.0,这也起了作用。激活的bundle现在不包含任何OSGi依赖项。只需强调,导入包和在bundle中嵌入一组类之间有很大的区别。导入是好的,但是嵌入会导致类路径混乱。使用maven bundle插件,并不总是清楚您做了哪些工作,因此值得检查您的清单和bundle,看看它为您提供了什么。听起来像是“包括”
“e”意味着你知道它嵌入了你的依赖项,但它是一个模棱两可的词。导入和嵌入有微妙的权衡。导入更安全,因为问题是由框架诊断的。嵌入的优点是易于使用,因为依赖项较少。谢谢。我开始使用org.apache.felix:org.apache.felix.main:4.0.3在Maven构建中提供OSGi组件,但不喜欢指定特定于供应商的OSGi,但是构建确实有效,组件在嵌入式felix中启动。然后我改为org.osgi:org.osgi.core:4.3.0,这也起了作用。激活的bundle现在不包含任何OSGi依赖项。只需强调,导入包和在bundle中嵌入一组类之间有很大的区别。导入是好的,但是嵌入会导致类路径混乱。使用maven bundle插件,并不总是清楚您做了哪些工作,因此值得检查您的清单和bundle,看看它为您提供了什么。听起来像“包含”意味着你知道它嵌入了你的依赖项,但它是一个模棱两可的词。导入和嵌入有微妙的权衡。导入更安全,因为问题是由框架诊断的。嵌入的优点是易于使用,因为依赖关系较少。
Map<String, String> config = new HashMap<>();
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, 
           Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
Framework framework = frameworkFactory.newFramework(config);