Java 让Eclipse OSGI激活器彼此继承是个好主意吗?
如果您有一个通用的eclipse/osgi代码平台,您可以/应该从通用代码中继承Activator吗 例如 org.test.common.pluginatorJava 让Eclipse OSGI激活器彼此继承是个好主意吗?,java,eclipse,eclipse-plugin,osgi,bundle,Java,Eclipse,Eclipse Plugin,Osgi,Bundle,如果您有一个通用的eclipse/osgi代码平台,您可以/应该从通用代码中继承Activator吗 例如 org.test.common.pluginator org.test.common.ui.ui org.test.product1.Product1PluginActivator org.test.product1.ui.Product1UIPluginActivator org.test.product2.Product2PluginActivator org.test.product
org.test.common.ui.ui org.test.product1.Product1PluginActivator
org.test.product1.ui.Product1UIPluginActivator org.test.product2.Product2PluginActivator
org.test.product2.ui.Product2PluginActivator 我希望所有的UI激活器都继承自通用的UI激活器,非UI激活器也是如此。start方法都将调用super。。。 然而,我想知道这是否是糟糕的osgi/捆绑实践,或者可能会导致问题
有人对此有什么想法/意见吗?如果孩子在没有父包的情况下无法运行(即,它对父包具有功能依赖性),则您不能通过使激活器从父包继承来添加任何附加耦合
我会小心从一个普通的父级继承,除非插件已经有理由这样做,因为你正在强制加载包,即使你只是继承了一些常量。如果子级没有父级的包也不能运行(即它有一个函数依赖关系),通过使激活器从中继承,您不会添加任何额外的耦合
我会小心从一个普通的父级继承,除非插件已经有理由这样做,因为即使你只继承了一些常量,你也会强制加载包。我假设你在做EclipseRCP,否则我建议使用SpringDM(或者iPOJO、带Peaberry的谷歌Guice,或者声明性服务,…)。这样,您就再也不需要编写另一个bundle激活器了
另一方面,我的团队为我们的RCP相关包使用了通用的抽象
BundleActivator
。对我来说,在一个中央捆绑包中使用实际的捆绑包激活器会增加耦合。我假设您正在使用Eclipse RCP,因为否则我建议使用Spring DM(或iPOJO、带Peaberry的Google Guice或声明性服务,…)。这样,您就再也不需要编写另一个bundle激活器了
另一方面,我的团队为我们的RCP相关包使用了通用的抽象
BundleActivator
。对我来说,在一个中心束(S)中有一个实际的束激活器会增加耦合。 < P>我不会,我实际上会认为这是一个滥用子类一般(而不是严格地从OSGI的观点)。
IMHO最好的方法是保持activator类本身最小(如在代码和运行时性能足迹中),主要是将实际工作(如果有的话)委托给工作者类。如果你必须对任何子类进行分类,你可以用那些工人类来做。 < P>我不会,我实际上会认为这是对子类的滥用(而不是严格地从OSGI的观点来看)。
IMHO最好的方法是保持activator类本身最小(如在代码和运行时性能足迹中),主要是将实际工作(如果有的话)委托给工作者类。如果您必须对任何内容进行子类化,您可以使用这些工作类进行子类化。如果您选中了在加载该插件的某个类时激活该插件,如果您没有继承并访问该常量,该插件还会被加载吗,但是如果这是两者之间的唯一关系,那么最好不要引用常量。我想用例更像是在公共包中有init代码,您希望确保它运行,然后从公共激活器启动方法调用它,然后访问包(通过常量等)强制加载并确保运行init代码。这听起来像是代码的味道。一般来说,插件应该在第一次需要时延迟加载,而不是在加载类时加载。如果您选中了“在加载插件的一个类时激活该插件”,那么如果您没有继承并访问常量,它还会加载吗,但是如果这是两者之间的唯一关系,那么最好不要引用常量。我想用例更像是在公共包中有init代码,您希望确保它运行,然后从公共激活器启动方法调用它,然后访问包(通过常量等)强制加载并确保运行init代码。这听起来像是代码的味道。通常,插件应该在第一次需要时延迟加载,而不是在类加载时。