2012-03-12 79 views
9

我开发了一个Eclipse RCP应用程序,该应用程序大量使用OSGi包,它们提供服务供以后使用。用例要求捆绑包注册他们的服务(例如导入过滤器),以便以后在不同情况下使用。 OSGi包是使用maven-bundle-plugin构建的。如何在Eclipse平台上自动启动/急切启动OSGi服务

如何告诉Equinox自动启动OSGi包?通过Activator的正常方法不起作用。只有懒惰模式正在工作,但我无法触摸未知捆绑中的类。我读了OSGi规范,并且没有提供与延迟加载相反的负载。是否有另一个机会来标记自动加载的捆绑包?

在Eclipse中我有机会将自动启动设置为true,但是在Maven和Tycho的发布版本中,我该怎么做?

由于未加载org.eclipse.equinox.ds的问题,声明式服务不起作用。我可以以某种方式启动它而不是激活器吗?这也是一个解决方案,但我不知道如何构建分布或设置为配置。

这里有什么最佳实践?还有其他的可能吗? Eclipse平台上OSGi捆绑包的文档有点简单。

+1

我不知道maven/tycho。但是如果你使用pde ant脚本,它使用'config.ini'来控制自动启动。检查'workspace \ .metadata \ .plugins \ org.eclipse.pde.core \ your-rcp-product-name.product'下生成的'config.ini'。 – 2012-03-13 09:02:22

+1

请参阅http://software.2206966.n2.nabble.com/tycho-generated-config-ini-does-not-start-runtime-td6077893.html – 2012-03-13 09:03:45

回答

4

您的声明式服务正处于正确的轨道上。手动注册您的服务就像努力工作,安全地查看它们可以做更多的工作,并且很难正确地进行。在这个领域要注意的另一个标准是Blueprint,尽管如果你有DS元数据,我当然不会建议你重写任何东西。蓝图在非常动态的环境中具有更好的特性,并且配置更丰富。 (我是Blueprint实现之一的提交者,Apache Aries)。对于Blueprint和DS而言,重要的是其他事情是为您管理您的服务。

这让我们回想起为什么你的软件包没有启动的问题。我认为他们确实从Felix开始的事实必须有线索。你是否启动了Equinox控制台并确认所有捆绑包已安装并解决? ('ss'列出软件包。) 您是否看过config.ini文件,并确认您的软件包已列出并具有适当的启动级别 - 或者您是否使用Equinox自动启动 - 其他软件包?

+0

是的,我会尝试接下来的声明性服务。我会稍后再说。 – 2012-03-13 19:38:30

+0

所以,它工作。我让DS在运行时启动,并通过XML声明服务。之前的服务已经解决并且未开始。我怎么能影响这个,我不知道。但DS正在工作。 – 2012-03-22 11:39:20

0

MANIFEST.MF有这样的:

Bundle-ActivationPolicy: lazy 

这也有用:

http://wiki.eclipse.org/Lazy_Start_Bundles#Should_I_change_to_the_new_Bundle-ActivationPolicy_Header.3F

但是我要说我会尝试依靠OSGI激活尽可能。如果没有其他解决问题的方法,那么以前的链接可能会有所帮助。

+2

对于延迟加载,我的应用程序需要了解要激活的包。这不是想要的,也不是一个好的设计。这就是为什么我删除了延迟加载。在菲利克斯我的捆绑被正确激活。只是Equinox会造成一些麻烦。我需要的是'Bundle-ActivationPolicy:auto',但是这不被支持。 – 2012-03-13 07:29:47

5

您可以在插件中使用“org.eclipse.ui.startup”扩展点。这允许您指定一个在Eclipse UI启动时将被调用的IStartup类。只要这是你的包中的一个类,那么你的包就会启动。

这将意味着包括一个plugin.xml文件,这将是一个Eclipse插件而不是标准的OSGi包,但是您可以使用这个插件来激活任何标准的OSGi包。

+0

我使用的一些软件包是相当通用的,我不想让它们使用eclipse插件。我知道,将plugin.xml和其他文件捆绑到jar中并不是问题,但我认为它不是很干净。你的建议很好,我认为它会起作用,但我认为这是我的最后选择。不管怎么说,还是要谢谢你! – 2012-03-13 19:35:49

+0

我不认为有任何需要修改您当前的捆绑包。 Eclipse插件可以简单地成为一个新的包,只需确保DS包已经启动,这样您的声明式服务就可以找到。这避免了必须在config.ini文件中指定启动软件包。 – 2012-03-14 08:27:08

8

感叹。你是Eclipse中误导性策略的受害者,以防止(愚蠢)程序员延长启动时间。他们没有提出警告,而是决定不开始打包。这与OSGi推荐的相反:-(一个捆绑只能被激活(他们基本上是无效的开始),当有人从它加载类(这是什么惰性激活是)。

到目前为止最好的解决方案是使用声明式服务(Declarative Services),你可以声明即时服务,这些服务将在启动时被激活,并且你可以声明惰性服务,这些服务在使用时会被激活,懒惰当然是首选的(当你不是愚蠢的程序员时)需要立即,像例如,提供其服务在互联网上的服务器你必须确保你的config.ini DS正在启动

+0

是的,我已经阅读了有关不同的philosphies。我喜欢并支持延迟加载,但正如您所提到的那样:某些设计需要自动加载才能注册服务(白板模式)。我会尝试声明式服务。 – 2012-03-13 19:37:53

+0

正如你所说,除非在配置中明确列出,否则Eclipse通常不会启动任何包,或者它使用延迟激活并且有一个类由其他包加载。这是DS的问题,因为停止/安装捆绑包会被忽略。但是,我注意到Equinox服务组件运行时具有隐藏功能:如果您将套件声明为延迟加载,并且组件标记为“立即”,则SCR将为您启动套件*(很可能是因为SCR数字表明,如果没有人开始它,没有人会)。还没有关于非直接行为的想法。 – JBert 2015-09-21 19:49:58

0

您可以添加到您的.product文件:。

<configurations> 
    <plugin id="my.plugin.id" autoStart="true" startLevel="4" /> 
</configurations> 

或者,在Eclipse中打开.product文件并转到配置选项卡,然后在该处添加具有所需启动级别的插件。

相关问题