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
- 首先安装并启用
Plugin DevKit插件。 - 使用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
本文使用 mdnice 排版