Eclipse插件片段

时间:2009-03-23 15:44:54

标签: java eclipse plugins

有没有人有一个“hello world”示例或教程来创建Eclipse插件片段?

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

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”。有人可以给我一个有效的例子吗?

5 个答案:

答案 0 :(得分:17)

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

  2. 打开插件清单编辑器(您可以点击build.propertiesmanifest.mffragment.xml来执行此操作 - 如果没有这样的文件,手工创建)

  3. 在标签 Extentions 中,点击添加.. 并添加org.eclipse.ui.startup并浏览实现org.eclipse.ui.IStartup类的类。

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

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

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

    • Fragment-Project - root dir
      • / <强> META-INF
        • MANIFEST.MF
      • / src (这是源目录)
        • FragmentStartClass.java (实现org.eclipse.ui.IStartup接口和earlyStartup方法)
      • build.properties
      • fragment.xml

    META-INF / MANIFEST.MF 内容:

    Manifest-Version: 1.0 
    Bundle-ManifestVersion: 2 
    Bundle-Name: FragmentProject 
    Bundle-SymbolicName: FragmentProject;singleton:=true 
    Bundle-Version: 1.0.0 
    Bundle-ClassPath: src/,. 
    Fragment-Host: *HostPluginProjectSymbolicName*;bundle-version="1.0.0" 
    Bundle-RequiredExecutionEnvironment: J2SE-1.5 
    Require-Bundle:  
    

    build.properties 内容:

    source.. = src,\
    output.. = bin/
    bin.includes = META-INF/,
                  .,
                      fragment.xml
    

    fragment.xml 内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <?eclipse version="3.2"?>
    <fragment>
       <extension
             point="org.eclipse.ui.startup">
          <startup
                class="FragmentStartClass">
          </startup>
       </extension>
    </fragment>
    

    FragmentStartClass.java 内容:

    import org.eclipse.ui.IStartup;
    
    
    public class FragmentStartClass implements IStartup {
    
        public void earlyStartup() {
           System.out.println("Hello World From Fragment!");
    
        }
    
    
    }
    

答案 1 :(得分:3)

那么,首先你想要完成什么?你确定片段是解决方案吗?

片段只是对现有插件的补充。没有Bundle-Activator来“启动”片段。您只需获取片段中的其他资源即可。您可以使用扩展点通知主机某个特定功能是由当前片段扩展的。可以把它想象成在运行时将两者合并。

请参阅this note中的Eclipse Wiki

答案 2 :(得分:0)

如果主机插件不知道加载片段的额外实现代码,我不确定你是否可以这样做。

例如:

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是主机插件中定义的接口,由您的片段实现。

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

答案 3 :(得分:0)

我认为通过使用extension points和单独的插件可以更好地完成您要做的事情,因为您希望向基础插件添加功能。

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

答案 4 :(得分:0)

为了记录,我刚刚创建了一个包含一些PMD Java规则类的Eclipse Fragment。

在类文件旁边,该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文件放入<eclipse root>/dropins/plugins(如果该文件夹尚未存在,则创建该文件夹)。