idea插件开发(idea配置插件)

IDEA作为我们(后端Java开发者)必不可少的IDE,以其智能的代码提示、多样的框架支持、简洁的开发界面等特性,被业界公认为最好的Java开发工具之一。而一款IDE是否强大,最简单的衡量标准就是查看其插件生态环境的发展情况,多种多样的插件既丰富了IDE自身的功能,同时大大提高了开发人员的工作效率。

一 概念简介插件类型

IDEA的插件根据功能分为以下4种类型:

自定义语言支持,例如Go语言插件。这种插件包括文件类型识别、格式化、语言保留字支持、编译、运行等语言开发必备功能。属于比较重量级的插件。开发框架支持,例如Spring框架插件。这种插件包括框架特殊代码识别、框架功能支持等。不同开发框架开发量、难度不同。工具集成,例如我司内容的云雀,就是这种插件,也是最常用的插件,后续的开发实例也属于这种类型。这种插件一般包括额外的功能、功能相关的UI以及访问外部资源。UI附加,主要限于UI的修改。开发目录结构组成部分配置文件,配置文件就是插件对IDE的自我介绍,IDEA中是META-INF/plugin.xml,详细的配置信息请参见官方文档。ClassLoader,每个插件对应一个ClassLoader,彼此之间隔离(类似于Pandora的插件机制)。Component(组件),插件内部可以有三个级别的组件:Applciation、Project、Module,分别需要在plugin.xml文件配置,并实现不同的接口。扩展和扩展点(Extesions and Extension Points),扩展用于扩展IDEA自身或者其他组件扩展点的功能,例如添加一个自定义的JavaDoc中的Tag。扩展点是插件提供给其他插件使用的。动作(Action),动作在配置文件中配置,由某个菜单项触发。图标(Icon),插件使用到的图标。服务(Service),用于后端运行的某些服务实现。依赖(Dependencies),插件可能依赖的其他插件、三方包等。二 开发过程简述

此部分以一个简单插件开发实例进行说明。

1 创建项目

IDEA插件项目开发时,有两种创建方式,一种是IntelliJ Platform Plugin,另一种是Gradle下的IntelliJ Platform Plugin(在Gradle插件安装的情况下)。推荐使用第二种方式,使用Gradle的方式可以方便的添加第三方依赖库,同时也是官方推荐的方式。

选择好创建方式后,根据需要填写信息即可完成创建。

2 设置创建入口

由于实例插件是一个工具集成类型的插件,我们需要在IDEA的UI添加插件的入口,这部分在配置文件plugin.xml中添加如下内容:

<actions> <!-- Add your actions here --> <group id="分组id" text="显示文本1" description="鼠标驻留时的显示"> <add-to-group group-id="MainMenu(这个id指的是IDEA的顶部菜单)" anchor="位置(last等)"/> <action class="动作类全路径" id="动作类id" text="显示文本2" description="鼠标驻留时的显示"/> </group> </actions>

我们可以发现,入口就是一个Action。需要申明Action的位置和处理类。以上声明的UI效果:

3 编写处理逻辑

在配置文件中指明的动作处理类中添加处理逻辑。具体逻辑根据实际需要。

三 使用总结1 弹出对话框

使用:

Messages.showErrorDialog(myTabbedPane.getComponent()," 弹出文本内容");2 提示信息

使用 new Notification(groupId 自定义, 标题, 内容, 类型(info、warning、error)).notify(项目对象实例);

3 扩展点使用

在配置文件中,添加扩展点配置,其他扩展点类型:

<extensions defaultExtensionNs="com.intellij"> <!-- 添加自定义扩展标签,这里的customJavadocTagProvider是IDEA自身申明的 --> <customJavadocTagProvider implementation="扩展点实现类"/> </extensions>

自定义JavaDoc的扩展效果:

4 自定义LiveTemplate

(1)在plugin.xml中配置liveTemplate扩展点的相关实现:

<!-- 自定义LiveTemplate --> <defaultLiveTemplatesProvider implementation="DefaultLiveTemplatesProvider接口的实现类"/> <!-- 自定义LiveTemplate上下文,以及上下文可以使用的配置 --> <liveTemplateContext implementation="TemplateContextType类的子类"/>

(2)在 DefaultLiveTemplatesProvider 接口的实现类的 getDefaultLiveTemplateFiles 方法中注册LiveTemplate定义文件:

@Override public String[] getDefaultLiveTemplateFiles() { //文件名不需要有后缀,例如a.xml,这里只需要输入a return new String[]{"liveTemplates/文件1", "liveTemplates/文件2"}; }

(3)在 TemplateContextType 类的子类的构造方法中定义上下文名称,以及 isInContext 方法中定义上下文可以使用的位置。例如:

public XXXJavaInlineCommentContextType() { super("上下文id", "名称", 上下文基础类型); } @Override public boolean isInContext(@NotNull final PsiFile file, final int offset) { if (PsiUtilCore.getLanguageAtOffset(file, offset).isKindOf(JavaLanguage.INSTANCE)) { PsiElement element = file.findElementAt(offset); if (element instanceof PsiWhiteSpace && offset > 0) { element = file.findElementAt(offset-1); } if (null == element) { return false; } return (element.getParent() instanceof PsiInlineDocTag && element.getParent().getParent() instanceof PsiDocTag) || (element.getParent() instanceof PsiInlineDocTag && PsiTreeUtil.getParentOfType(element, PsiField.class, false) != null); } return false; }

(4)编写LiveTemplate定义xml文件,例如:

<templateSet group="分组名"> <template name="模板名" value="模板值,可以使用$VAR1$来指代变量位置" description="描述信息" toReformat="false" toShortenFQNames="true"> <variable name="变量名" expression="" defaultValue="" alwaysStopAt="true" /> <context> <option name="自定义的或者预定义的template上下文id" value="true" /> </context> </template> </templateSet>5 插件中调用Dubbo

(1)在Gradle的构建文件build.gradle中的dependencies内添加如下配置:

compile org.apache.dubbo:dubbo:2.7.7 compile org.apache.dubbo:dubbo-dependencies-zookeeper:2.7.7

(2)在接口调用处进行如下编码:

//将当前线程的classloader备份,并设置当前线程的classloader为当前类的classloader //当前线程的classloader是IDEA的,当前类的classloader是当前插件的 //不进行如此设置会造成Dubbo扩展点实现无法在ClassLoader中找到 ClassLoader backCl = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); // 以下内容参考Dubbo的泛化调用 // 当前应用配置 ApplicationConfig application = new ApplicationConfig(); application.setName("应用名"); // 连接注册中心配置 RegistryConfig registry = new RegistryConfig(); registry.setAddress("zookeeper://127.0.0.1:2181"); // 引用远程服务 ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏 reference.setApplication(application); reference.setRegistry(registry); // 多个注册中心可以用setRegistries() reference.setInterface("服务全类名"); reference.setVersion("服务版本号"); reference.setGeneric(true); // 和本地bean一样使用xxxService GenericService genericService = reference.get(); //泛化调用 Object result = genericService.$invoke("方法名", new String[]{"参数类型"}, new Object[]{"参数值"}); System.out.println(result); //恢复classloader设置 Thread.currentThread().setContextClassLoader(backCl);6 发布插件的指定IDEA仓库

(1)在build.gradle文件中进行如下配置

publishPlugin { host = https://xxxx.com //仓库地址 username onepublish //仓库指定用户名 password onepublish //仓库密码 token onepublish //仓库验证token }

(2)执行gradle中publishPlugin任务。

7 发布到指定IDEA插件失败

当我们开发完成后,通过publishPlugin任务发布时,可能会出现以下报错信息:

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

这个问题的原因是我们使用的org.jetbrains.intellij版本较高,请使用2.x的版本。或者参照插件的源码自己写一个没有accept的上传方法即可。

相关代码:

package idea; import retrofit.RestAdapter; import retrofit.client.Request; import retrofit.client.Response; import retrofit.client.UrlConnectionClient; import retrofit.converter.SimpleXMLConverter; import retrofit.mime.TypedFile; import retrofit.mime.TypedString; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; /** * @author lijie * @date 2019/1/17 */ public class PublishPluginTest { public static void main(String[] args) { PluginRepositoryService service = new RestAdapter.Builder().setEndpoint("https://插件仓库链接").setClient(new UrlConnectionClient() { @Override protected HttpURLConnection openConnection(Request request) throws IOException { HttpURLConnection connection = super.openConnection(request); connection.setReadTimeout(10 * 60 * 1000); return connection; } }).setLogLevel(RestAdapter.LogLevel.BASIC) .setConverter(new SimpleXMLConverter()) .build() .create(PluginRepositoryService.class); Response response = service.uploadByXmlId(new TypedString(""), new TypedString(""), new TypedString(pluginId), new TypedString("default"), new TypedFile("application/octet-stream", new File(plugin压缩文件路径))); System.out.println(response.getBody()); } }package idea; import retrofit.client.Response; import retrofit.http.*; import retrofit.mime.TypedFile; import retrofit.mime.TypedString; /** * @author lijie * @date 2019/1/17 */ public interface PluginRepositoryService { @Multipart @POST("/plugin/uploadPlugin") public Response uploadByXmlId(@Part("userName")TypedString username, @Part("password")TypedString password, @Part("pluginId")TypedString pluginId, @Part("channel")TypedString channel, @Part("file")TypedFile file); }8 如何在插件中引入本地jar包

在build.gradle的dependencies里边添加如下内容:

compile fileTree(dir:src/main/resources/lib,includes:[*jar])

然后,将本地jar包放到指定目录即可。

来源:阿里云开发者社区

版权声明:本文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,不拥有所有权,不承担相关法律责任,转载请注明出处。本文地址:https://www.sip-server.cn/37475.html

上一篇 2023年6月24日 下午3:33
下一篇 2023年8月10日 上午10:44

相关推荐

  • 博客怎么赚钱(博客怎么样)

    您是经验丰富的博主吗?还是您只是想了解博客世界的新手?无论您站在什么立场,我们都有一个共同的目标:写出更好的博文。所以这里有一些关于如何通过 博客的伟大之处在于它在不断发展。总有新的提示和技巧可以帮助您将博客提升到一个新的水平。 什么是博客? 博客的核心是与世界分享您的想法和经验。这是一种与志趣相投的人联系的方式,也是分享您独特的声音和观点的平台。 为什么写…

    创业分享 2023年3月15日
    10500
  • 微信怎么解封账号-微信登不上去怎么办

    微信被限制了怎么解除限制?当出现了限制的提示时,往往伴随着被封号/限制的处罚,给生活和工作带来极大的影响,今天我们来讲一讲相关知识与解决方法,希望能够帮助到大家! 当出现问题时,不要惊慌和抱怨,先仔细的阅读系统限制的公告,根据公告中的相关信息先确认限制的类型。 常见的限制分为两类:“限制登录”和“限制功能”.所谓的限制登录是指账号无法登录,而限制功能是指号可…

    2023年2月2日
    8800
  • 养什么鸽子最赚钱(农村养鸽子挣钱吗)

    文/大海棠 现在社会发展的速度相信大家都是看在眼里的,除了城市,农村的发展速度其实是更加的迅速的,很多地区都逐渐摆脱贫穷,温饱问题早已解决,朝着”小康村”的方向发展。现在农村能有这么好的面貌,一是得益于有关部门对农村经济发展的大力支持,二是农民通过外出打工、创业等自身的努力,最终使得很多村子越来越好。 时代确实也是在不断进步的,21世…

    2023年3月7日 创业分享
    11100
  • 微博炫富事件(网上炫富的好处与坏处)

    最近微博上又掀起了一波“炫富挑战”热 大家纷纷脸朝地“扑街” 看似“一不小心”摔出了“全部家当” 实际上是在高调炫富 不信你看 你省吃俭用几个月买的奢侈品 人家直接摔了一地 除了网友 还有很多媒体和机构 纷纷晒出了行业的正能量 让人眼前一亮 but~ 不管炫富挑战怎么进行 都是为了博大家一笑 只是小编在这里要提醒各位看官 有些人炫富 可不单单是为了娱乐 而是…

    创业分享 2023年3月17日
    7700
  • 适合创业的小项目-2020年适合大学生创业的项目

    疫情期间,大量公司、厂房、店铺倒闭,很多人也因此失去了工作。但是,现代社会是一个多元化的社会,2023年,作为“穷人”和普通人的我们,想要谋取一份工作或者创业机会,也并非不可能,前提在于我们需要好好谋划。下面的这些创业项目投资小,而且不需要多大的投资,但是回报却是稳稳的。 1、出摊卖小吃。小吃摊不是小吃店,可以减少租金的投入。但关键是找到适合自己的经营品。因…

    2023年2月1日
    12500
  • 乔布斯死亡原因(乔布斯癌症治好了)

    一提到苹果手机,人们都会想到乔布斯。这周五(2月24日)是苹果公司创始人乔布斯的生日。众所周知,乔布斯患癌8年后去世,当时年仅56岁。很多人以为他得的是恶性胰腺癌,然后猜想肯定是因为他很有钱,所以才能活这么久,毕竟胰腺癌的平均生存期还不到1年。 其实乔布斯当年的癌症,很多人都搞错了。他得的不是胰腺癌,而是胰腺神经内分泌瘤(缩写为PNET),是一类恶性程度较低…

    2023年3月21日 创业分享
    8900
  • 网站首页被k(网站被k查询)

    大家好,我是黄大司,今天我们讲一下,网站被K的问题。 网站被K是什么意思呢?K是英文单词Kill(杀)的缩写,网站被K,意思就是网站被搜索引擎封杀了,网站被K对于站长和公司来说,都会造成比较大的流量损失,网站被K一般会出现这样一些情况:1、全站被K;2、首页被K;3、内页被K;4、快照停滞;5、快照回档;6、不放出收录;7、site网站不在首页;8、蜘蛛不抓…

    创业分享 2023年3月19日
    8200
  • 博客优化网站seo怎么写文章(文思泉什么意思)

    本篇文章我们将分享6个SEO技巧,帮助你的营销团队能更快速编写吻合优质SEO结构的内容文章。 本文节选自2022年SKUKING跨境电商数字化赋能沙龙撷英分享,根据SKUKING跨境电商研究中心编辑整理。粉丝朋友可以「点击头像,进入主页」查看往期内容中SKUKING的更多分享,获取完整行业洞察报告等资料。 当你发布的博客文章使用SEO技巧、执行策略性的撰写方…

    2023年3月14日 创业分享
    7400
  • 女性创业项目(有没有适合女性创业的项目)

    当今社会,女性的压力越来越大,不仅要和男性一样外出打拼,有时还需要背负沉重的家庭责任。但有时候压力就是动力,越来越多的女性开始走上创业的道路,期望通过创业来实现自己的人生价值。那么女性创业该选择什么项目呢?投资开店就来和大家分享四个适合女性创业的新兴创业项目。 第一、贩卖灌装氧气。慈善名人陈光标可以卖新鲜空气,那女性创业者选择贩卖氧气作为创业项目同样可行。现…

    2023年2月12日
    8900