Eclipse插件开发-程序员宅基地

技术标签: 插件开发  eclipse  

基础知识

1.Eclipse的架构

architecture=架构
platform=平台

2.扩展点

代码1-1 plugin.xml中声明扩展

<extension point="被使用扩展点的ID">
    ......
</extension>

Eclipse平台提供的扩展点有
增加菜单项
增加视图
增加编辑器

工作台和资源访问的API是Eclipse提供的API中最基本的,在插件开发时使用频率较高的API。在这里不做详细的说明,在以后得例子中会出现一些这样的API。
 使用PlatformUI作为工作台访问的入口点和使用ResourcesPlugin作为工作区访问的入口点,是无论如何也要记住的。

3.工作台(Workbench)

从插件的代码中访问工作台使用org.eclipse.ui.PlatformUI类。代码1-2说明了从PlatformUI中取得工作台和工作台窗口的代码示例。

代码1-2 使用PlatformUI访问工作台

//取得工作台
IWorkbench workbench = PlatformUI.getWorkbench();
//取得工作台窗口
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
//取得工作台页面
IWorkbenchPage page = window.getActivePage();
//取得当前处于活动状态的编辑器窗口
IEditorPart part = page.getActiveEditor();

4.工作区和资源API

对工作区的访问需要使用org.eclipse.core.resources.ResourcesPlugin。代码1-3是利用IWorkspaceRoot,去的工作区内的工程的代码示例

代码1-3 使用ResourcesPlugin访问工作区

//取得工作区的root
IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
//取得项目
IProject[] projects = wsroot.getProjects();

第一个Eclipse插件

1.生成插件工程

选择新建一个插件工程,选择[插件工程(Plug-in Project)],新建一个现有的hello world模板
在这里插入图片描述

2.插件的动作

manifest编辑器的[概要]页面右侧[启动Eclipse应用(Luanch an Eclipse application)]。点击后,会启用一个新的Eclipse实例。
 在这里插入图片描述

  • MANIFEST.MF和plugin.xml
一个插件包含MANIFEST.MF和plugin.xml两个配置文件。MANIFEST.MF是OSGi的handler配置文件,记录了插件ID、名称、作者、和其他插件的依赖关系等。plugin.xml记录了插件的扩展和扩展点的定义等信息。

3.PDE(插件开发环境)的功能

  • Manifest编辑器
  • 在这里插入图片描述

在这里插入图片描述

  1. 解读示例插件的代码
  • plugin.xml
为了在菜单栏增加一个项目,文件中使用了extension元素。
①的id指定了扩展点的名称org.eclipse.ui.actionSets。extension里的内容根据扩展点而不同。示例插件中包含了actionSet、menu、action等元素。
②中的class属性指定了actions.SampleAction类作为响应菜单或者工具栏按钮的action类。
  • SampleAction.java

①run()方法内记录了action执行时的处理。利用MessageDialog.openInformation方法打开了一个对话框。

  • Activator.java
    这个类对插件的生命周期进行了管理,被称为插件类。
    在这里插入图片描述

插件的测试与调试

  1. 使用JUnit对插件进行测试
    在这里插入图片描述

  2. 调试和错误处理

  • 输出日志
        向Eclipse下的[.metadata]文件夹的[/.log]文件进行日志输出。输出日志时使用org.eclipse.core.runtime.ILog接口,通过插件类获得ILog接口的实例。
ILog log = Activator.getDefault().getLog();
         
log.log(new Status(IStatus.OK, Activator.PLUGIN_ID,
    0, "正常消息", null));
         
log.log(new Status(IStatus.OK, Activator.PLUGIN_ID,
    0, "异常消息", new Exception("输出日志的异常")));

在这里插入图片描述

  • 错误通知
    错误发生后通知使用者的方法有很多,最简单的方法就是使用JFace的org.eclipse.jface.dialogs.ErrorDialog类。
try{
    
    //....
}catch(Exception e){
    
    IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
            0, e.toString(), e);
    ErrorDialog.openError(window.getShell(), "错误", "插件出错了!", status);
}

OSGi框架

OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环境里的服务平台。框架提供的主要功能是对应用和组件的生命周期管理,系统可以在无需重启的情况下,远程操纵组件的安装、启动、停止。

在Eclipse快捷方式上加入-console参数,可以在Eclipse启动的同时创建一个OSGi框架控制台。
在这里插入图片描述

制作OSGi Bundle

1. 生成OSGi工程
在这里插入图片描述
在这里插入图片描述
生成工程后,在Manifest编辑器中点击[启动框架(Launch the framework)]运行新生成的OSGi Bundle。执行后可能会出现大量的错误。原因是Eclipse中的OSGiBundle在OSGi框架中注册了,但是UI相关的部分没能启动。我们进入[运行设置(Run Configuration)],取消所有的Bundle绑定,只选中我们当前要测试的Bundle。

在这里插入图片描述

2. OSGi Service和Tracker

上一节我们制作了一个简单的在启动和停止时输出消息的Bundle。代码很简单的实现了BundleActivator接口的sart()和stop()方法,在其中利用System.out.println打出了信息。

public class Activator implements BundleActivator {
    
 
    public void start(BundleContext context) throws Exception {
    
        System.out.println("Hello World!!");
    }
     
    public void stop(BundleContext context) throws Exception {
    
        System.out.println("Goodbye World!!");
    }
}

在OSGi框架中为了生命周期管理提供了开始和停止方法,仅此而已,OSGi Bundle就可以运行起来了。OSGi框架有一种可以为多个Bundle提供作为共通(Common)使用的Service功能,称为OSGi Service。

最简单的OSGi Service
public class OSGiService {
    
    public void doSomething(){
    
        System.out.println("Running Common Service");
    }
}
代码3 执行OSGi Service
public class Activator implements BundleActivator {
    
 
    public void start(BundleContext context) throws Exception {
    
        System.out.println("Hello World!!");
        // 注册OSGi Service
        context.registerService(OSGiService.class.getName(), new OSGiService(),
                new Properties());
    }
 
    public void stop(BundleContext context) throws Exception {
    
        System.out.println("Goodbye World!!");
        // 生成Service Tracker
        ServiceTracker tracker = new ServiceTracker(context,
                OSGiService.class.getName(), null);
 
        tracker.open();
        // 取得Service
        OSGiService service = (OSGiService) tracker.getService();
        // 执行Service
        service.doSomething();
    }
}

3. Bundel的安装和更新

OSGi框架在JavaVM不重启的情况下也可以安装和卸载Bundle。
将工程导出到c盘根目录下,启动OSGi控制台输入install file:\\C:\plugins\NewBundle_1.0.0.201008182238.jar。再通过ss命令确认bundle的安装。

代码6 Bundle的安装和卸载

osgi> install file:\\\C:\plugins\NewBundle_1.0.0.201008182238.jar
Bundle id is 321
 
osgi> ss New
 
Framework is launched.
 
id      State       Bundle
321     INSTALLED   NewBundle_1.0.0.201008182238
 
osgi> start NewBundle
New bundle start!!
 
osgi> uninstall NewBundle
New bundle stop!!
 
osgi> ss New
 
Framework is launched.
 
id      State       Bundle
 
osgi>

在这里插入图片描述

SWT简介

	swt,主要是一些界面的布局开发。可以自己定制一些简单的页面,绑定一些事件。

GEF,是开发编辑器的一种常用技术。

EMF,是开发复杂模型的框架。

GMF,是GEF与EMF的整合,但是包含的插件包很多,因此不推荐学习。如果使用的话,自己整合GEF和EMF也是可以的。红皮书里面有整合的内容。

下载安装SWT插件

百度去官网下载

问题

eclipse 插件开发 添加第三方jar包

Java Project :
      导入jar包,项目 名称 右键->build path -> add library 或者 add external archives 导入jar包

Plug-in Project : 

     将要导入的jar包放进插件project的根目录下新建的lib文件夹中,编辑plug.xml的runtime选项卡在Classpath一栏中选择Add导入lib/xxx.jar

插件工程不能在Build path中添加jar包,即不能使用Java Project的方式,否则上面做的不起作用。

OSGi常见问题总结

参考资料

博客
电子书
基于eclipse的翻译插件


IDEA插件开发

在这里插入图片描述

1.使用Gradle 新建idea工程
在这里插入图片描述

2.工程配置 build.gradle
idea,jvm,gradle版本

sourceCompatibility=1.8
intellij{
    
	version='idea的版本号(2021.1.2)'}
	updateSinceUntilBuild=false //忽略版本冲突

在这里插入图片描述

  • 然后刷新Gradle,会去下载版本依赖
  • 在Gradle/intellij/runlde

3.基础组件介绍

  • Anaction
    New - Plugin DecKit - Action
    在这里插入图片描述
JBPopup popup = JBPopupFactory.getInstance().createMessage("Hello world");
popup.showInBestPositionFor(e.getDataContext();

  • 对话框

  • 弹出框
    -New Swing UI设计器 - Create Dialog Class
    根据 Swing UI设计器 拖拽设置IU
    在这里插入图片描述
    配置plugin.xml
    在这里插入图片描述

4.打包发布

  • Gradle
    1.intellij - buildPlugin 生成一个zip文件
    在这里插入图片描述
  1. updateSinceUntilBuild=false //忽略版本冲突
    在这里插入图片描述

IDEA插件开发参考资料

京东插件教程
毒鸡汤,代码阅读笔记实战教程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenhangx/article/details/119863089

智能推荐

【贪心】【Uva11292】 勇者斗恶龙_勇者斗恶龙csdn-程序员宅基地

文章浏览阅读2.3k次。直接用白书上的翻译吧例题1 勇者斗恶龙(The Dragon of Loowater, UVa 11292)你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。_勇者斗恶龙csdn

In-Sight Explorer 仿真器无法正常启动与连接问题解决过程-程序员宅基地

文章浏览阅读2.5k次。In-Sight Explorer 仿真器无法正常启动与连接问题解决过程一、问题出现经过在某天突然报错查不到问题所在偶然间发现这个二、问题解决过程1.首先查看下自己的端口占用情况2. 再查看下自己默认动态的端口区段3. 修改端口区段中动态端口配置5. 重启电脑后生效并检查6. 重新打开In-Sight软件的仿真器OK三、总结一、问题出现经过在某天突然报错一段时间没打开In-Sight IDE软件了,突然有天打开发现这个IDE软件启动报错:服务端口1096端口…查不到问题所在显然是端口占用问题,但通_in-sight explorer

【密评】商用密码应用安全性评估从业人员考核题库(三)-程序员宅基地

文章浏览阅读2.3k次。多项选择题 按照《关键信息基础设施安全保护条例》,某商用密码服务机构的信息系统被依法认定为关键信息基础设施,在日常安全审计中,发现该信息系统近日来遭受持续的APT攻击,导致了大量商用密码业务数据的泄露,信息系统所在机构立即采取了相应的应急处置措施,但为了减少对于自身信誉的影响,选择不向主管部门报告,针对该行为,下列表述正确的是( )。单项选择题 根据密码分析者所掌握的分析资料的不同,密码分析一般可为四类:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击,其中()是在公开的网络中能获得的最现实的能力。

fatal: destination path '.' already exists and is not an empty directory. 错误及解决办法_c:\users\prl\desktop\thicknessvaries' already exis-程序员宅基地

文章浏览阅读10w+次,点赞16次,收藏17次。今天在使用Git for Windows clone代码时,遇到了题目所示的错误,简单来说就是目标路径‘.’已经存在并且不是一个空目录。可是在我在文件夹下并没有看到任何文件,显示“该文件夹为空”,然后自然而然地,我想到了这个'.'路径是不是被Windows隐藏了?于是我打开工具->文件夹选项->查看->显示隐藏文件,终于发现了隐藏文件夹“.git”。删掉该文件夹后,再次执行git cl_c:\users\prl\desktop\thicknessvaries' already exists and is not an empty dir

python处理表格数据-60万行的Excel数据,Python轻松处理-程序员宅基地

文章浏览阅读507次。原标题:60万行的Excel数据,Python轻松处理一个朋友在某运动品牌公司上班,老板给他布置了一个处理客户订单数据的任务。要求是根据订单时间和客户id判断生成四个新的数据:1、记录该客户是第几次光顾2、上一次的日期时间是什么时候3、与上次订单的间隔时间4、这是一个existing客户还是一个new客户(见定义)推荐下我自己创建的Python学习交流群960410445,这是Python学习交流..._python 逐条存储表格数据

CRMEB Min电商系统商城源码 v4.3.2_crmeb多商户源码-程序员宅基地

文章浏览阅读890次。CRMEB Min是CRMEB品牌全新推出的一款轻量级、高性能、前后端分离的开源电商系统,完善的后台权限管理、会员管理、订单管理、产品管理、客服系统、CMS管理、多端管理、页面DIY、数据统计、系统配置、组合数据管理、日志管理、数据库管理,一键开通短信、产品采集、物流查询等接口,系统采用TP6+Mysql+Uniapp+iView+Redis+workerman+form-builder等最流行热门的技术,支持队列、PHP快速生成表单、长链接、定时任务、事件订阅、图表统计、表格导出、自动接口文档,完善的使用_crmeb多商户源码

随便推点

软件设计模式初了解_对软件设计模式的认识-程序员宅基地

文章浏览阅读173次。软件设计模式一、软件设计模式的产生背景1、设计模式出处设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造》(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行_对软件设计模式的认识

无问西东_粗布衣茅草房 铁骨铮铮-程序员宅基地

文章浏览阅读176次。梅贻琦对吴岭澜说:“人把自己置身于忙碌当中,有一种麻木的踏实,但丧失了真实,你的青春也不过只有这些日子。  什么是真实?  你看到什么,听到什么,做什么,和谁在一起  有一种,从心灵深处,满溢出来的不懊悔,也不羞耻的平和与喜悦。”1分24秒旋律的突变,配合电影中一群来路不明战机的出现,看的时候心立即就揪起来了,以为光耀遇到了敌机埋伏,旋律再次回归正常,看到了光耀队友们战机向贫民窟的孩子们投..._粗布衣茅草房 铁骨铮铮

云计算(五)——Mapreduce 的使用_mapreduce使用-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏10次。一、Mapreduce 计算整数的最大值和最小值【实验目的】1)理解mapreduce执行原理2)理解map,reduce阶段3)函数的使用【实验原理】需求描述:对输入文件中数据进行计算找出这一组数据中的最大值和最小值。原始数据:1021039109200..._mapreduce使用

尚硅谷React实战项目踩坑记录_bundle.js:305982 warning: react does not recognize-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏17次。本次实战项目素材来自尚硅谷的React全展现全栈,项目内容是使用react + antd的方式开发后台管理系统,本文在这里记录一下开发时踩到的小坑以及解决方案,希望能对你有帮助!_bundle.js:305982 warning: react does not recognize the `eventkey` prop on a

计算机网络思科参考答案--IP 编址考试_哪一项是 ipv6 地址 2002:0420:00c4:1008:0025:0190:0000:09-程序员宅基地

文章浏览阅读4.5w次,点赞42次,收藏286次。请参见图示。 管理员必须向路由器 A 网络中的所有成员发送一条消息。 那么网络 172.16.16.0/22 的广播地址是什么?172.16.23.255172.16.255.255172.16.16.255172.16.20.255 172.16.19.255请参见图示。 思考一下 10.16.10.0/24 网络范围内已经使用了的地址和必须保留的地址,下列哪个子网地址可以分配给包含 25 台主机的网络?10.16.10.240/2810.16.10.12..._哪一项是 ipv6 地址 2002:0420:00c4:1008:0025:0190:0000:0990 的简写格式?

【python】python二手房数据抓取分析可视化(源码)【独一无二】_二手房数据爬取与可视化分析-程序员宅基地

文章浏览阅读4.9k次,点赞9次,收藏9次。博__主:米码收割机技__能:C++/Python语言公众号:测试开发自动化【获取源码+商业合作】荣__誉:阿里云博客专家博主、51CTO技术博主专__注:专注主流机器人、人工智能等相关领域的开发、测试技术。_二手房数据爬取与可视化分析

推荐文章

热门文章

相关标签