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