最近工作比较繁忙,都没有时间写技术博客了,最近工作中用gradle管理项目,每次更改了模块关系或者更新了SVN,都要重新gradle和重新刷新和编译,每次要做这些操作都要切换到工作空间的文件夹中执行bat脚本,所以为了节约时间,就开发了个插件在eclipse中一键操作就可以了,插件开发如下:
1、在eclipse树目录下,单击右键New---->other---->Plug-in Project,填写project name,如gradlePlug,然后next
2、ID,Version,Name默认即可,Vendor填写开发者名字,然后其他默认,next
3、选择Hello,World,next
4、java Package Name: 填写包名,跟类的包名一样,根据自己的需要填写,我这里填写的是com.sf.gradleplug,
Action Class Name:这个插件按钮点击执行的类,根据自己需要填写,我填写的是GradleEclipseAction
Message Box Text:当鼠标放在按钮上的提示信息,根据自己填写,我填写的是Gradle-eclipse,然后finish
5、新建工程完成后,你可以看到一个Activator类,这个类你不用去管他,还有一个类是GradleEclipseAction,就是刚刚填写的,里面有一个run()方法,我们写代码主要就是在这里,写相关的操作。
6、还有一个比较重要的xml文件,就是plugin.xml,我们要改的就是menu,action标签,menu就是eclipse在头上展现的菜单,我这里label填写的是Gradle,最后在eclipse头上会出现Gradle菜单
7、action标签分析
icon="icons/e.png"//按钮的图标
class="com.sf.gradleplug.actions.GradleEclipseAction"//按钮执行的事件对应的类
tooltip="Gradle-eclipse"//鼠标移动到按钮的提示信息
menubarPath="sampleMenu/sampleGroup"//菜单组
toolbarPath="sampleGroup"
id="com.sf.gradleplug.actions.GradleEclipseAction">
如果有多个按钮,就写多个action标签。
1、获取项目所在工作空间路径问题,网上看了很多是这么获取的,但我试了没有用,一直都是获得空,网上的代码如下:
public static IProject getCurrentProject() throws CoreException{
ISelectionService selectionService =
Workbench.getInstance().getActiveWorkbenchWindow().getSelectionService();
ISelection selection = selectionService.getSelection();
IProject project = null;
if(selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection)selection).getFirstElement();
System.out.println(element.getClass().getName());
if (element instanceof IResource) {
project= ((IResource)element).getProject();
} else if (element instanceof PackageFragmentRootContainer) {
IJavaProject jProject =
((PackageFragmentRootContainer)element).getJavaProject();
project = jProject.getProject();
} else if (element instanceof IJavaElement) {
IJavaProject jProject= ((IJavaElement)element).getJavaProject();
project = jProject.getProject();
}else{
project = ((Project)element).getProject();
//project = ((TreeSelecti;
}
}
return project;
}
用以上代码需要org.eclipse.core.resources.jar和eclipse.jar两个jar包。最后我用Platform.getInstanceLocation().getURL().getPath();就可以获得到工作空间绝对路径
2、在插件开发中,有时点击插件的时候希望输出一些信息到console中,如果直接用System.out.print()是没有用的,需要自己调用Console,步骤如下:
A、打开插件开发工具,即双击plugin.xml即可,选中Dependencies,然后点击add,搜索console,选中org.eclipse.ui.console即可,相当于把jar包加入
B、编写代码,如下:
public class ConsoleFactory {
private MessageConsole console = null;
private MessageConsoleStream consoleStream = null;
private IConsoleManager consoleManager = null;
private final String CONSOLE_NAME = "Console";
private void initConsole() {
consoleManager = ConsolePlugin.getDefault().getConsoleManager();
IConsole[] consoles = consoleManager.getConsoles();
if(consoles.length > 0){
console = (MessageConsole)consoles[0];
} else{
console = new MessageConsole(CONSOLE_NAME, null);
consoleManager.addConsoles(new IConsole[] { console });
}
consoleStream = console.newMessageStream();
}
/**
* 开启console, 打印相关消息
* @param message 消息内容
*/
public void printMessage(String message) {
if (message != null) {
if (console == null) {
initConsole();
}
// 显示Console视图
consoleManager.showConsoleView(console);
// 打印消息
consoleStream.print(message + "\n");
}
}
}
直接调用printMessage即可
3、java 调用windows的bat文件遇到的一些问题。
A、如何调用,调用代码如下:
Runtime rt = Runtime.getRuntime();
Process p = null;
String cmd = "cmd.exe /C start D:\\workspace\\gradle-eclipse.bat";
p = rt.exec(cmd);
其中,cmd.exe /C start 是固定写法,D:\\workspace\\gradle-eclipse.bat是bat文件所在位置
B、以上调用会弹出黑色的弹出框,如果不想弹出,并想把信息输出到Console中,需要在start后加上 /b,完整代码如下:
Runtime rt = Runtime.getRuntime();
Process p = null;
String cmd = "cmd.exe /C start \b D:\\workspace\\gradle-eclipse.bat";
try {
p = rt.exec(cmd);
InputStream in = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream(), "GBK"));// 注意中文编码问题
String line;
ConsoleFactory console = new ConsoleFactory();
while ((line = br.readLine()) != null) {
console.printMessage(line);//输出到console
}
p.waitFor();
in.close();
} catch (Exception e) {
}
C、还有一个比较坑的问题就是,如果你的bat文件又调用了其他的bat,而调用的时候用的是相对路径,这个时候调用会找不到这个bat文件,所以这个时候自己在写一个bat,然后先切换到执行的路径,然后在执行,切换路径bat命令为:cd /d E:\\eclipse\\ bat所在的路径,然后在调用
D、在调用bat的时候用start,并且bat文件最后要加上exit ,不能用call,用call会阻塞,程序不能自动关闭。