我开发了一个Eclipse RCP应用程序,该应用程序大量使用OSGi包,这些包提供以后使用的服务。用例要求捆绑包注册其服务(例如导入过滤器)以便稍后在不同情况下使用。 OSGi包使用maven-bundle-plugin构建。
如何告诉Equinox自动启动OSGi包?通过Activator的常规方法不起作用。只有懒惰模式正在工作,但我无法触及未知包中的类。我阅读了OSGi规范,并且没有提供与延迟加载相反的负载。是否还有机会将捆绑标记为自动加载?
在Eclipse中,我有机会将Auto-Start设置为true,但是我在Maven和Tycho的分发版本中做了什么?
由于未加载org.eclipse.equinox.ds的问题,声明性服务无法正常工作。我能以某种方式开始而不是激活器吗?这也是一个解决方案,但我不知道如何构建分发或如何设置配置。
这里的最佳做法是什么?还有其他可能性吗? Eclipse平台上关于OSGi包的文档有点薄。
答案 0 :(得分:9)
叹息。您是Eclipse中误导策略的受害者,以防止(哑)程序员延长启动时间。而不是警告,他们只是决定不开始捆绑。这与OSGi推荐的相反:-(当一个人从中加载一个类时,一个包只能被激活(它们基本上无效开始)(这就是懒惰的激活。)
迄今为止最好的解决方案是使用声明式服务。您可以声明将在启动时激活的即时服务,并且您可以声明延迟服务,这些服务在使用时会被激活。懒惰当然是首选(当你不是一个愚蠢的程序员)但某些用例需要立即,例如通过互联网提供服务的服务器。您必须在config.ini中确保DS已启动。
答案 1 :(得分:6)
您可以在插件中使用“org.eclipse.ui.startup”扩展点。这允许您指定将在Eclipse UI启动时调用的IStartup类。只要这是您的捆绑中的一个类,那么您的捆绑包就会启动。
这将意味着包含一个plugin.xml文件,这将是一个Eclipse插件,而不是标准的OSGi包,但您可以使用此插件来激活任何标准的OSGi包。
答案 2 :(得分:4)
您使用声明性服务走在正确的轨道上。手动注册您的服务很像是一项艰苦的工作,安全地查找它们可能会更加有效,并且很难做到正确。这个领域的另一个标准是Blueprint,虽然如果你有DS元数据,我当然不建议你改写任何东西。 Blueprint在非常动态的环境中具有更好的特性,并且配置更丰富。 (我是其中一个蓝图实现的提交者,Apache Aries。)对于Blueprint和DS,重要的是其他东西正在为您管理您的服务。
这让我们回想起为什么你的捆绑没有被启动的问题。我认为必须有一个线索,他们确实从菲利克斯开始。您是否启动了一个equinox控制台并确认所有捆绑包已安装并解决? ('ss'列出包。) 您是否查看过config.ini文件并确认列出了捆绑包,并且具有适当的启动级别 - 或者您使用的是Equinox auto-start-everything捆绑包?
答案 3 :(得分:0)
您可以将其添加到.product
文件中:
<configurations>
<plugin id="my.plugin.id" autoStart="true" startLevel="4" />
</configurations>
或者,打开Eclipse中的.product
文件并转到Configuration选项卡,然后在那里添加具有所需启动级别的插件。
答案 4 :(得分:-1)
MANIFEST.MF有这个:
Bundle-ActivationPolicy: lazy
这可能也很有用:
但是我会说我会尽可能地尝试依赖OSGI激活。如果没有其他方法可以解决您的问题,那么之前的链接可能有所帮助。