1

我想创建一个包含声明性服务的插件模板。到目前为止,我一直遵循“创建自己的 Eclipse 插件”的指导,效果很好。然后我在 MyOptionTemplateSection 的 updateModel(..) 方法中生成 OSGI-INF/my-component.xml 文件,它也可以完美运行。

..但是我需要在我想要创建的项目的 MANIFEST.MF 文件中添加额外的一行,这就是我卡住的地方:

服务组件:OSGI-INF/mycomponent.xml

我怎样才能最好地做到这一点?在生成捆绑包之前,我没有看到任何将其插入项目模型的方法,如果我尝试在我的 OptionTemplateSection 的 updateModel(..) 期间访问 Manifest.MF 文件,它还不可用。在我开始讨论 executors 之类的东西之前,我想知道是否有一种优雅的方法来解决这个问题;我不认为这是一个不寻常的要求,能够在模板中声明组件。

提前致谢!

4

1 回答 1

1

好吧,在跟随 Greg 的领导一天之后,我找到了一个不太优雅但足够接近的解决方案。如果有人想要更改 manifest.mf 文件,那么必须获得 PDE 的 IBundle 接口。遗憾的是,PDE 不鼓励访问此接口,很可能是因为它仍在开发中(我感觉 PDE 团队正在逐步淘汰“插件”的概念,转而支持“捆绑”,这是有道理的)。

无论如何,在 OptionTemplateSection 的 updateModel(...) 方法或 NewPluginTemplateWizard 的 performFinish(..) 方法中,您会得到一个 IPluginModel,它实际上是一个 IBundlePluginModelBase。以下三行将为您的清单文件添加一个服务组件:

@Override
    protected void updateModel(IProgressMonitor monitor) throws CoreException {
        IBundlePluginModelBase mb = (IBundlePluginModelBase) model;
        IBundle bundle = mb.getBundleModel().getBundle();
        bundle.setHeader( "Service-Component", "OSGI-INF/component.xml" );
                ....
        }

bundle.setHeader(key, value) 允许您在清单文件中包含任何行,因此您也可以使用它来创建片段包、Web-Context 或自定义清单

正如我所说,这个解决方案会产生“不鼓励访问”的警告,但我个人认为这是一个过度受限的 PDE 选择,而不是编码不正确的问题。

于 2013-09-04T19:34:46.360 回答