Idea插件开发之G2M2G
众做周知,idea是一个很强大的工具。最强的地方就是它的成长性,可塑性。你可以根据自己的喜好来调教它。
从快捷键设置,到代码模板,再到插件开发。一步步它可以成长为最牛B的开发工具。
之前遇到过一个问题,这个问题对有些人可能不是问题。
闲话少叙,由于公司版本管理工具使用的是Gradle
, 不过旧的项目还有使用Maven
。有时候想拷贝一个依赖,在Maven
里是这样的
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<exclusions>
<exclusion>
<groupId>swagger-annotations</groupId> <artifactId>swagger-models</artifactId> </exclusion> </exclusions> <version>1.5.22</version> </dependency>
但是Gradle
是这样的
compile(group: "io.swagger", name: "swagger-models", version: "1.5.22"){
exclude group: 'swagger-annotations', module: 'swagger-models'
}
有时候从Maven复制到Gradle时,要手动改成这个样子,好麻烦…
还有时候从Gradle复制到Maven,还要手动改,更麻烦…
一开始想用 Live Templates
模板配置,但是试了很多方法,还是不行。
于是想自己写一个插件。g2m2g
,意思就是Gradle to Maven and Maven to Gradle
。
idea插件开发
Plugin DevKit
1、 首先安装并启用 Plugin DevKit
插件。
2、 使用Gradle开发插件。使用Gradle可以很好地管理依赖。
项目结构
plugin.xml
这个是插件的配置信息。
创建一个Action
选择EditorPopupMenu
,在编辑器里右键弹出。
创建之后,在plugin.xml
里会自动生成配置信息。
然后就可以在Action里写业务代码了。
Gradle to Maven
package com.ler.action;
import com.alibaba.fastjson.JSONObject;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ide.CopyPasteManager; import com.ler.action.entity.MavenJsonBean; import com.ler.action.util.GradleParser; import com.ler.action.util.SelectUtil; import java.awt.datatransfer.StringSelection; /** * @author lww */ public class Gradle2MavenAction extends AnAction { @Override public void actionPerformed(AnActionEvent e) { //获取当前在操作的工程上下文 //Project project = e.getData(PlatformDataKeys.PROJECT); String data = SelectUtil.getSelectString(e); if (data == null) { return; } MavenJsonBean bean = GradleParser.parseGradle(data); String xml = GradleParser.jsonToXml(JSONObject.toJSONString(bean)); CopyPasteManager.getInstance().setContents(new StringSelection(xml)); //Messages.showMessageDialog(project, "转换成功,已复制,去粘贴吧!", "Success", Messages.getInformationIcon()); } }
- 首先获取选择的内容
package com.ler.action.util;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.editor.Editor;
/** * @author lww * @date 2020-05-27 19:59 */ public class SelectUtil { public static String getSelectString(AnActionEvent e) { //获取选择的文本 Editor editor = e.getData(CommonDataKeys.EDITOR); if (editor == null) { return null; } String data = editor.getSelectionModel().getSelectedText(); if (data == null || data.isEmpty()) { return null; } return data; } }
- 我是创建了一个类用来存储依赖。先解析出Gradle里的依赖,存到对象里,然后转为Json,再转为xml。
- Maven对象
package com.ler.action.entity;
import java.util.List;
import lombok.Data;
/** * @author lww * @date 2020-05-27 16:09 */ @Data public class MavenJsonBean { private DependencyBean dependency; @Data public static class DependencyBean { private String groupId; private String artifactId; private ExclusionsBean exclusions; private String version; @Data public static class ExclusionsBean { private List<ExclusionBean> exclusion; @Data public static class ExclusionBean { private String groupId; private String artifactId; } } } }
解析Gradle依赖用的是正则表达式,用到了正向先行断言和正向后行断言。
private final static Pattern GROUP_PB = Pattern.compile("(?<=group:)(.)+(?=, name)");
private final static Pattern NAME_PB = Pattern.compile("(?<=name:)(.)+(?=, version)");
private final static Pattern VERSION_PB = Pattern.compile("(?<=version:)(.)+");
private final static Pattern EX_GROUP_PB = Pattern.compile("(?<=group:)(.)+(?=, module)");
private final static Pattern MODEL_PB = Pattern.compile("(?<=module:)(.)+");
JSON2XML
/**
* Json to xml string.
*
* @param json the json
* @return the string */ public static String jsonToXml(String json) { try { StringBuffer buffer = new StringBuffer(); JSONObject jObj = JSON.parseObject(json); String xmlstr = json2Xmlstr(jObj, buffer); return buffer.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * Json to xmlstr string. * * @param jObj the j obj * @param buffer the buffer * @return the string */ private static String json2Xmlstr(JSONObject jObj, StringBuffer buffer) { Set<Map.Entry<String, Object>> se = jObj.entrySet(); for (Entry<String, Object> en : se) { if ("com.alibaba.fastjson.JSONObject".equals(en.getValue().getClass().getName())) { buffer.append("<").append(en.getKey()).append(">"); JSONObject jo = jObj.getJSONObject(en.getKey()); json2Xmlstr(jo, buffer); buffer.append("</").append(en.getKey()).append(">"); } else if ("com.alibaba.fastjson.JSONArray".equals(en.getValue().getClass().getName())) { JSONArray jarray = jObj.getJSONArray(en.getKey()); for (int i = 0; i < jarray.size(); i++) { buffer.append("<").append(en.getKey()).append(">"); JSONObject jsonobject = jarray.getJSONObject(i); json2Xmlstr(jsonobject, buffer); buffer.append("</").append(en.getKey()).append(">"); } } else if ("java.lang.String".equals(en.getValue().getClass().getName())) { buffer.append("<").append(en.getKey()).append(">").append(en.getValue()); buffer.append("</").append(en.getKey()).append(">"); } } return buffer.toString(); }
Maven to Gradle
package com.ler.action;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.ler.action.util.SelectUtil; import com.ler.action.util.XmlParser; import java.awt.datatransfer.StringSelection; /** * @author lww */ public class Maven2GradleAction extends AnAction { @Override public void actionPerformed(AnActionEvent e) { //获取当前在操作的工程上下文 Project project = e.getData(PlatformDataKeys.PROJECT); String data = SelectUtil.getSelectString(e); if (data == null) { return; } try { String compile = XmlParser.parseXml(data); CopyPasteManager.getInstance().setContents(new StringSelection(compile)); //Messages.showMessageDialog(project, "转换成功,已复制,去粘贴吧!", "Success", Messages.getInformationIcon()); } catch (Exception ex) { ex.printStackTrace(); Messages.showMessageDialog(project, "转换失败!", "Error", Messages.getInformationIcon()); } } }
XML2Json
public static String parseXml(String xmlStr) throws Exception {
//xml 2 json
JSONObject jsonObject = XML.toJSONObject(xmlStr);
MavenJsonBean mavenJsonBean = com.alibaba.fastjson.JSONObject.parseObject(jsonObject.toString(), MavenJsonBean.class);
StringBuilder sb = new StringBuilder();
DependencyBean dependency = mavenJsonBean.getDependency(); sb.append("compile(group: \"") .append(dependency.getGroupId()) .append("\", name: \"") .append(dependency.getArtifactId()); if (dependency.getVersion() == null || dependency.getVersion().isEmpty()) { sb.append("\")"); } else { sb.append("\", version: \"") .append(dependency.getVersion()) .append("\")"); } if (dependency.getExclusions() != null && dependency.getExclusions().getExclusion() != null && dependency.getExclusions().getExclusion().size() > 0) { List<ExclusionBean> exclusion = dependency.getExclusions().getExclusion(); sb.append("{"); for (ExclusionBean ex : exclusion) { sb.append("\n exclude group: '").append(ex.getGroupId()).append("', module: '").append(ex.getArtifactId()).append("'"); } sb.append("\n }"); } return sb.toString(); }
打包及运行插件
打包成功,插件在
安装打包的插件
效果
- Maven2Gradle
- 转换后的效果
- Gradle2Maven
- 转换后的效果,没有格式化
- 格式化一下
- 有一个问题,如果没有
exclusion
,会有一个空的exclusions
代码粘的不全,源码地址: 码云
打包好的插件地址 链接: 百度云 密码:oatf
本文使用 tech.souyunku.com 排版