懒惰激活Eclipse插件

Beh*_*nil 6 osgi eclipse-rcp

我想知道什么是"在加载其中一个类时激活此插件",Eclipse清单编辑器中的复选框非常有用.

我以为Eclipse总是使用"懒惰初始化"的方法.这个选项是否与插件的BundleActivator类有关系?是初始化与激活不同的东西?

是一个类似的问题,但我完全不理解.

Nei*_*ett 15

勾选该框会导致在清单中设置以下标头:

Bundle-ActivationPolicy: lazy
Run Code Online (Sandbox Code Playgroud)

我将从"纯粹的"OSGi处理这个问题开始.如果束被开始与START_ACTIVATION_POLICY标志,则该包进入STARTING状态,但不调用激活的start()方法和类加载器没有分配给包.束停留在STARTING,直到,不管出于什么原因,一类需要从捆装.在这一点上一个ClassLoader分配和活化剂(如果有的话)被实例化,加载所请求的类之前被调用它的start()方法.

但是,Eclipse在顶部层叠了其他语义.作为背景,Eclipse总是试图避免启动bundle以保持其启动时间最小化.默认情况下会启动一个非常小的核心束集(列表在configuration/config.ini中),其中一个称为p2"simpleconfigurator".simpleconfigurator查找具有Bundle-ActivationPolicy:lazy标题的包,并使用START_ACTIVATION_POLICY标志启动它们...因此,如上所述,这些包将"懒洋洋地"启动.

重要的是,在Eclipse下根本不会启动所有其他不包含头的bundle .它们将保持RESOLVED状态,不会调用它们的激活器,如果它们包含任何Declarative Services组件,它们将不会被加载.这是因为Declarative Services只查看处于ACTIVE或STARTING状态的bundle.

因此,使用标头的主要原因是我们是否要编写包含需要在Eclipse下工作的Declarative Services组件的包.

在其他环境中,不需要使用标头.大多数普通的OSGi应用程序只是启动所有捆绑包,而不是尝试选择性地启动捆绑包的子集.请注意,这并不意味着OSGi应用程序不担心延迟加载!声明性服务已经支持延迟加载,而不会搞乱bundle类加载触发器.在我看来,Eclipse出错了,并为bundle生命周期增加了不必要的复杂性.然而,如果您在Eclipse中运行,那么您别无选择,只能理解并使用它的限制.