无法在Eclipse上运行配置管理

无法在Eclipse上运行配置管理,eclipse,osgi,apache-felix,equinox,declarative-services,Eclipse,Osgi,Apache Felix,Equinox,Declarative Services,我正在尝试使用Configuration Admin将配置信息传递给捆绑包。 我正在使用基于OSGI的Equinox实现的声明性服务。首先,由于我找不到配置管理的Equinox实现,我安装了felix实现,因此如果有人建议我在哪里可以获得Equinox版本,那就太好了 我的主要问题是:当我运行程序时,总是会出现以下错误。似乎一个空的“配置”对象正在传递给我的更新方法 osgi> !SESSION 2014-08-10 06:54:09.862 -----------------------

我正在尝试使用Configuration Admin将配置信息传递给捆绑包。 我正在使用基于OSGI的Equinox实现的声明性服务。首先,由于我找不到配置管理的Equinox实现,我安装了felix实现,因此如果有人建议我在哪里可以获得Equinox版本,那就太好了

我的主要问题是:当我运行程序时,总是会出现以下错误。似乎一个空的“配置”对象正在传递给我的更新方法

osgi> !SESSION 2014-08-10 06:54:09.862 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.7.0_51
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
Command-line arguments:  -dev file:C:/Users/Desktop/OSGI/eclipseee/workspace1/.metadata/.plugins/org.eclipse.pde.core/configurator/dev.properties -os win32 -ws win32 -arch x86 -consoleLog -console

!ENTRY org.apache.felix.configadmin 4 0 2014-08-10 07:09:52.639
!MESSAGE Cannot use configuration de.services.logger.mtinylogger for   [org.osgi.service.cm.ManagedService, id=33, bundle=11/initial@reference:file:../workspace1/de.services.logger.mtinylogger/]: No visibility to configuration bound to initial@reference:file:../workspace1/de.init.configurator/
我制作了一个configurator捆绑包,用于创建配置对象,其激活方法(由声明性服务调用)中的主要内容是:

奇怪的是,当我停止并启动正在更新的包时,它总是显示“配置等于null”,就好像我还没有创建配置对象一样。我在这里错过了什么??我花了将近两周的时间试图解决运行配置管理的问题,但这占用了我太多的时间。我真的很想知道一些这方面的信息。txs

编辑: 在这里,我添加了注册ManagedService的类的“activate”方法

    protected void activate( BundleContext ctx )
{
    Dictionary< String, Object > properties = new Hashtable< String, Object >();

    //properties.put( Constants.SERVICE_PID, ctx.getBundle().getSymbolicName() );//optionally
    properties.put( Constants.SERVICE_PID, "de.services.logger.mtinylogger" );

    mService = ctx.registerService( ManagedService.class.getName(), this, properties );
}
protectedvoid激活(BundleContext ctx)
{
Dictionaryproperties=newhashtable();
//properties.put(Constants.SERVICE_PID,ctx.getBundle().getSymbolicName());//可选
properties.put(Constants.SERVICE_PID,“de.services.logger.mtinylogger”);
mService=ctx.registerService(ManagedService.class.getName(),this,properties);
}

您的问题不在于您在春分点使用Felix捆绑包。遵循该标准的OSGi捆绑包可以用于任何框架实现

您的问题是使用了“错误”的方法来创建配置:

configAdmin.getConfiguration("de.services.logger.mtinylogger");
问题是,此方法将隐式地将配置“绑定”到此捆绑包(configurator),因此此配置所针对的捆绑包将不再看到它。简而言之,用以下方法替换您的方法:

configAdmin.getConfiguration("de.services.logger.mtinylogger", null);
这样,配置就不会被绑定,并且可以用于预期目标


我对绑定的解释相对较短,OSGi规范(免费提供)对其进行了更详细的说明。

您的问题不是在Equinox上使用Felix捆绑包。遵循该标准的OSGi捆绑包可以用于任何框架实现

您的问题是使用了“错误”的方法来创建配置:

configAdmin.getConfiguration("de.services.logger.mtinylogger");
问题是,此方法将隐式地将配置“绑定”到此捆绑包(configurator),因此此配置所针对的捆绑包将不再看到它。简而言之,用以下方法替换您的方法:

configAdmin.getConfiguration("de.services.logger.mtinylogger", null);
这样,配置就不会被绑定,并且可以用于预期目标


我对绑定的解释相对较短,OSGi规范(免费提供)对其进行了更详细的说明。

我按照您的建议添加了“null”,但我仍然得到了完全相同的结果。如果有帮助,我在问题的底部添加了activate类的代码,在这里我注册了managedService。在尝试我的建议之前,您是否清除了捆绑缓存。如果没有,旧配置可能仍然存在。此外,您的激活器似乎依赖于在此捆绑包之前启动的配置管理。否则,显然不会设置任何配置。我建议您考虑使用一种依赖关系管理解决方案。作为ApacheFelix依赖关系管理器的作者,我显然可以推荐这一个,但是OSGi规范也提供声明性服务,这对您的代码也很好。非常感谢您,它现在可以工作了。我不确定您关于依赖关系管理的意思,但我已经在使用声明性服务了。我仍然需要确保配置管理员的启动级别高于其他管理员,以便首先启动它。这就是我现在遵循的方法。(顺便说一句,我现在发布了另一个关于日志文件中出现错误的问题,每当我从控制台启动OSGI时,也许你也可以帮我解决这个问题。根据启动级别,通常这是一件非常危险的事情。我写了一篇博客来解释:我已经按照你的建议添加了“null”,但我仍然得到了完全相同的结果。在cas中e它有助于我添加了激活类的代码,我在问题的底部注册了managedService。在尝试我的建议之前,您是否清除了捆绑包缓存。如果没有,旧配置可能仍然存在。此外,您的激活器似乎依赖于在此捆绑包之前启动的配置管理。如果没有,则没有配置ion显然将被设置。我建议您考虑使用其中一种依赖关系管理解决方案。作为Apache Felix依赖关系管理器的作者,我显然可以推荐这种解决方案,但OSGi规范也提供声明性服务,这对您的代码也很好。非常感谢您,它现在可以工作了。我不是su您对依赖关系管理的意思是什么,但我已经在使用声明性服务。我仍然需要确保配置管理的启动级别高于其他级别,以便首先启动。这就是我现在采用的方法。(顺便说一句,我现在发布了另一个关于日志文件中出现错误的问题,每当我从控制台启动OSGI时,也许你也可以帮我解决这个问题。根据启动级别,这通常是一件非常危险的事情。我写了一个博客来解释: