我想知道 Eclipse 清单编辑器中的“加载其中一个类时激活此插件”复选框有什么用。
我认为 Eclipse 总是使用“延迟初始化”的方法。此选项是否与插件的 BundleActivator 类有关?初始化与激活有什么不同吗?
这是一个类似的问题,但我不完全理解。
我想知道 Eclipse 清单编辑器中的“加载其中一个类时激活此插件”复选框有什么用。
我认为 Eclipse 总是使用“延迟初始化”的方法。此选项是否与插件的 BundleActivator 类有关?初始化与激活有什么不同吗?
这是一个类似的问题,但我不完全理解。
勾选该框会导致在清单中设置以下标头:
Bundle-ActivationPolicy: lazy
我将从“纯”OSGi 如何处理这个问题开始。如果捆绑包以 START_ACTIVATION_POLICY 标志启动,则捆绑包进入STARTING
状态,但不会调用激活器的 start() 方法,并且不会为捆绑包分配 ClassLoader。包一直处于 STARTING 状态,直到出于某种原因需要从包中加载一个类。此时分配一个 ClassLoader 并实例化激活器(如果有),并在加载请求的类之前调用其 start() 方法。
然而,Eclipse 在顶部添加了额外的语义。作为背景,Eclipse 总是尽量避免启动捆绑软件以保持其启动时间最短。默认情况下会启动一组非常小的核心捆绑包(列表位于 configuration/config.ini 中),其中一个称为 p2“simpleconfigurator”。simpleconfigurator 查找具有Bundle-ActivationPolicy:lazy
标头的捆绑包,并以 START_ACTIVATION_POLICY 标志启动它们......因此这些捆绑包将如上所述“延迟”启动。
重要的一点是在 Eclipse 下根本不会启动所有其他不包含标头的包。它们将保持 RESOLVED 状态,它们的激活器不会被调用,如果它们包含任何声明式服务组件,它们将不会被加载。这是因为声明式服务只查看处于 ACTIVE 或 STARTING 状态的包。
因此,使用标头的主要原因是如果我们想编写一个包含需要在 Eclipse 下工作的声明式服务组件的包。
在其他环境中不需要使用 header。大多数普通的 OSGi 应用程序只是简单地启动所有捆绑软件,而不是尝试有选择地启动捆绑软件的子集。请注意,这并不意味着 OSGi 应用程序不担心延迟加载!声明式服务已经支持延迟加载,而不会弄乱捆绑类加载触发器。在我看来,Eclipse 搞错了,并且给包的生命周期增加了不必要的复杂性。然而,如果您在 Eclipse 中运行,那么您别无选择,只能理解和处理它的局限性。