Eclipse 插件片段

Posted

技术标签:

【中文标题】Eclipse 插件片段【英文标题】:Eclipse Plugin Fragment 【发布时间】:2010-10-15 00:08:59 【问题描述】:

有没有人有关于创建 的“hello world”示例或教程?

我有一个可以工作的主机插件,为了简单起见,就是这样...

public void start(BundleContext context) throws Exception 
    System.out.println("Hello....");
    super.start(context);
    plugin = this;


public void stop(BundleContext context) throws Exception 
    System.out.println("Goodbye...");
    plugin = null;
    super.stop(context);

足够简单并且有效。现在我想给那个主机添加一个片段,这似乎不像创建一个插件主机那么简单。我只是看不到如何创建片段项目并向其添加逻辑。假设我只想做一些简单的事情,让片段在start() 打印“Hello2”,在stop() 打印“Goodbye2”。有人可以给我一个工作示例吗?

【问题讨论】:

【参考方案1】:

    Eclipse -> 文件 -> 新建... -> 片段项目 ->设置主机插件(在您的工作区或目标平台的插件中)。

    打开插件清单编辑器(您可以通过单击build.propertiesmanifest.mffragment.xml 来完成 - 如果没有这样的文件,请手动创建)

    在标签Extensions中点击Add..并添加org.eclipse.ui.startup和浏览实现org.eclipse.ui.IStartup类的类。

    创建这个类并实现它。您需要实现方法earlyStartup(),它是片段的入口点。

注意:下面的行只是示例。我没有测试它,所以可能有错误......

你只需要这个(这是项目结构/目录结构):

Fragment-Project - 根目录 /元信息 MANIFEST.MF /src(源目录) FragmentStartClass.java(实现了org.eclipse.ui.IStartup接口和earlyStartup方法) build.properties fragment.xml

META-INF/MANIFEST.MF 内容:

清单版本:1.0 捆绑清单版本:2 捆绑包名称:FragmentProject Bundle-SymbolicName: FragmentProject;singleton:=true 捆绑版本:1.0.0 Bundle-ClassPath: src/,. 片段主机:*HostPluginProjectSymbolicName*;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment:J2SE-1.5 要求捆绑:

build.properties 内容:

源.. = src,\ 输出.. = bin/ bin.includes = META-INF/, ., 片段.xml

fragment.xml 内容:

启动> 片段>

FragmentStartClass.java 内容:

导入 org.eclipse.ui.IStartup; 公共类 FragmentStartClass 实现 IStartup 公共无效早期启动() System.out.println("Hello World From Fragment!");

【讨论】:

@Nathan 感谢您提供信息。不幸的是,自从我使用 Eclipse 以来已经有很长时间了,我什至不知道这个解决方案适用于哪个版本。我猜是 Eclipse Galileo (projects.eclipse.org/releases/galileo)。如果您知道,您能否发布一个有效的解决方案?谢谢...【参考方案2】:

嗯,首先你想完成什么?你确定碎片是解决方案吗?

片段只是对现有插件的简单补充。没有 Bundle-Activator 可以“启动”片段。您只需在片段中获得额外的资源。您可以使用扩展点通知主机某些特定功能已由当前片段扩展。可以将其视为在运行时将两者合并。

从Eclipse Wiki 中查看this note。

【讨论】:

【参考方案3】:

我不确定您是否可以在主机插件不知道加载片段的额外实现代码的情况下执行此操作。

例如:

MyInterface o = null;
try 
    Class<?> c = getClass().getClassLoader().loadClass("my.fragment.Activator");
    o = (MyInterface) c.newInstance();
 catch (ClassNotFoundException e) 


if (o != null) 
    o.start();

其中 MyInterface 是在宿主插件中定义的接口,并由您的片段实现。

另一种方法可能是让片段提供标识扩展类的扩展点,但这可能超出了需要。

【讨论】:

【参考方案4】:

我认为使用extension points 和单独的插件可以更好地满足您的要求,因为您想向基本插件添加功能。

片段仅用于向基础插件添加资源或额外的类。

【讨论】:

【参考方案5】:

为了记录,我刚刚创建了一个 Eclipse 片段,其中包含一些 PMD Java 规则类。

在类文件旁边,该 Jar 中只需要一个文件META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.acme.tools.pmd
Bundle-SymbolicName: com.acme.tools.pmd;singleton:=true
Bundle-Version: 1.0.0
Fragment-Host: net.sourceforge.pmd.eclipse.plugin;bundle-version="3.2.6"
Bundle-RequiredExecutionEnvironment: J2SE-1.5

我在当前的 Eclipse 3.7 上试过这个。部署是将 Jar 文件放入 &lt;eclipse root&gt;/dropins/plugins(如果该文件夹尚不存在,则创建该文件夹)。

【讨论】:

我也在尝试使用更新站点和 Jar 文件部署 Fragment 项目。对于更新站点,我仅为 Fragment 项目创建了更新站点,但是当我在 Eclipse 中安装时,它并没有反映我的更改。我已经尝试过你上面提到的方法,但我仍然没有得到。我需要遵循任何其他方法吗?请帮助

以上是关于Eclipse 插件片段的主要内容,如果未能解决你的问题,请参考以下文章

Jacoco和Tycho surefire的Eclipse RCP插件代码介绍

Eclipse中的JavaScript编辑器[关闭]

Eclipse:以编程方式导入项目而不进行复制

Eclipse 中的通用代码片段或模板

Eclipse 自动创建片段布局,我该如何禁用它

Eclipse OSGi 包需要另一个包的片段