跟着实例学eclipse插件开发--第五篇:插件自动升级

本文为大家讲解实现插件的自动升级功能,首先需要搭建一个ftp服务器,将最新的插件放到ftp指定位置:

跟着实例学eclipse插件开发--第五篇:插件自动升级_第1张图片

Eclipse启动时,通过ftp查看插件最新版本,如果和本地版本不一样,就下载最新版本。首次启动时,需要设置ftp基础属性:

跟着实例学eclipse插件开发--第五篇:插件自动升级_第2张图片

本文涉及到org.eclipse.ui.startup、org.eclipse.ui.preferencePages扩展点:

org.eclipse.ui.startup:Eclipse一启动的时候执行某些指定的操作

org.eclipse.ui.preferencePages:首选项(Preference)的扩展点

org.eclipse.ui.startup使用起来很简单,在plugin.xml中添加:


   

扩展点属性说明:   
point - 目标扩展点的标准标识(org.eclipse.ui.StartUp)
id - 扩展实例的可选标识。 
name - 扩展实例的可选名称。  
class - 实现 org.eclipse.ui.IStartup的类的标准名称。如果未指定此项,则将使用插件类。
不要指定插件类作为显式值,否则它将被实例化两次(一次由常规插件激活操作实例化,一次由此机制实例化)。这是一个注意事项。

然后创建MsunStartUp类,实现org.eclipse.ui.IStartup接口:

package com.msun.plug.start;

import java.io.File;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IStartup;

import com.msun.plug.page.Activator;
import com.msun.plug.page.MsunPreferencePage;
import com.msun.plug.util.FileUtil;
import com.msun.plug.util.FtpUtils;

/** 
* @Title:插件开发
* @Description:MsunStartUp业务类
* @Copyright:MSun (c) 2018年9月7日
* 
* @author:jiujiya
* @version:1.0 
*/
public class MsunStartUp implements IStartup {
	
	public static void main(String[] args) {
		new MsunStartUp().earlyStartup();
	}
    
    @Override
    public void earlyStartup() {
    	// 从ftp查看当前插件的版本,是否为最新版本
    	IPreferenceStore ps = Activator.getDefault().getPreferenceStore();
		String ip = ps.getString(MsunPreferencePage.IP_KEY);
		String host = ps.getString(MsunPreferencePage.HOST_KEY);
		String userName = ps.getString(MsunPreferencePage.USERNAME_KEY);
		String password = ps.getString(MsunPreferencePage.PASSWORD_KEY);
		if("".equals(ip) || "".equals(host)) {
			openInformation("ftp参数未设置,请先打开“Window-Preferences-upPlug插件设置”界面进行设置");
			return;
		}
        try {
        	FtpUtils ftp = new FtpUtils(ip, Integer.parseInt(host), userName, password);
            if(ftp.open()) {
            	// 获取插件最新版本
            	String lastVersion = getLastVersion(ftp);
            	// 获取插件名称
            	String plugName = lastVersion.split("_")[0];
            	// 获取当前插件的文件
            	File file = getNowVersion(plugName);
            	if(file == null || !file.getName().equals(lastVersion)) {
                	if(file != null) file.delete();
                	ftp.get("plug/" + lastVersion, FileUtil.getIdePath() + "/plugins/" + lastVersion);
                	openInformation(plugName + "插件更新成功,请重启eclipse");
            	}else {
                	openInformation("当前插件是最新版本");
            	}
            	ftp.close();
            }else {
            	openInformation("ftp打开失败,请检查ftp是否成功,或者修改插件ftp配置信息");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @param msg
     */
    private void openInformation(String msg) {
    	Display.getDefault().syncExec(new Runnable() {
			@Override
			public void run() {
				MessageDialog.openInformation(Display.getDefault().getActiveShell(), "信息", msg);
			}
		}); 
	}
    
    /**
     * 获取插件最新版本
     * @param ftp
     */
    private String getLastVersion(FtpUtils ftp) {
    	String tempVersionPath = FileUtil.getIdePath() + "/temp_version.txt";
    	new File(tempVersionPath).deleteOnExit();
    	ftp.get("plug/version.txt", tempVersionPath);
    	return FileUtil.readTextFile(tempVersionPath).toString();
	}
    
    /**
     * @return 当前插件的jar
     */
    private File getNowVersion(String plugName) {
    	File dirFile = new File(FileUtil.getIdePath() + "/plugins");
    	if(dirFile.isDirectory()) {
    		File[] files = dirFile.listFiles();
    		for (File file : files) {
				if(file.getName().startsWith(plugName + "_")) {
					return file;
				}
			}
    	}
    	return null;
	}
}

org.eclipse.ui.preferencePages的文件如下:

 
	
	

然后创建MsunPreferencePage,继承org.eclipse.ui.IWorkbenchPreferencePage:

package com.msun.plug.page;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import com.msun.plug.start.MsunStartUp;

/** 
* @Title:插件开发
* @Description:插件设置类
* @Copyright:MSun (c) 2018年9月7日
* 
* @author:-jiujiya
* @version:1.0 
*/
public class MsunPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ModifyListener {
    // 为文本框定义键值
    public static final String IP_KEY = "$IP_KEY";
    public static final String HOST_KEY = "$HOST_KEY";
    public static final String USERNAME_KEY = "$USERNAME_KEY";
    public static final String PASSWORD_KEY = "$PASSWORD_KEY";
    // 为文本框值定义默认值
    public static final String IP_DEFAULT = "192.168."; 
    public static final String HOST_DEFAULT = "21"; 
    public static final String USERNAME_DEFAULT = ""; 
    public static final String PASSWORD_DEFAULT = ""; 
    // 定义文本框
    private Text ipText;
    private Text hostText;
    private Text usernameText;
    private Text passwordText;
    // 定义一个IPreferenceStore对象
    private IPreferenceStore ps;

    // 接口IWorkbenchPreferencePage的方法,它负责初始化。在此方法中设置一个
    // PreferenceStore对象,由此对象提供文本框值的读入/写出方法
    @Override
    public void init(IWorkbench workbench) {
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
    }

    // 父类的界面创建方法
    @Override
    protected Control createContents(Composite parent) {
        Composite topComp = new Composite(parent, SWT.NONE);
        topComp.setLayout(new GridLayout(2, false));

        new Label(topComp, SWT.NONE).setText("FTP IP:");
        ipText = new Text(topComp, SWT.BORDER);
        ipText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(topComp, SWT.NONE).setText("FTP端口号:");
        hostText = new Text(topComp, SWT.BORDER);
        hostText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(topComp, SWT.NONE).setText("用户名:");
        usernameText = new Text(topComp, SWT.BORDER);
        usernameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(topComp, SWT.NONE).setText("密码:");
        passwordText = new Text(topComp, SWT.BORDER);
        passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        
        // 取出以前保存的值,并设置到文本框中。如果取出值为空值或空字串,则填入默认值。
        ps = getPreferenceStore();// 取得一个IPreferenceStore对象

        String ip = ps.getString(IP_KEY);
        if (ip == null || ip.trim().equals(""))
            ipText.setText(IP_DEFAULT);
        else
        	ipText.setText(ip);

        String host = ps.getString(HOST_KEY);
        if (host == null || host.trim().equals(""))
        	hostText.setText(HOST_DEFAULT);
        else
            hostText.setText(host);

        String username = ps.getString(USERNAME_KEY);
        if (username == null || username.trim().equals(""))
            usernameText.setText(USERNAME_DEFAULT);
        else
            usernameText.setText(username);

        String password = ps.getString(PASSWORD_KEY);
        if (password == null || password.trim().equals(""))
            passwordText.setText(PASSWORD_DEFAULT);
        else
        	passwordText.setText(password);

        // 添加事件监听器。this代表本类,因为本类实现了ModifyListener接口成了监听器
        ipText.addModifyListener(this);
        hostText.addModifyListener(this);
        usernameText.addModifyListener(this);
        passwordText.addModifyListener(this);
        return topComp;
    }

    // 实现自ModifyListener接口的方法,当三个文本框中发生修改时将执行此方法。
    // 方法中对输入值进行了验证并将“确定”、“应用”两按钮使能
    @Override
    public void modifyText(ModifyEvent e) {
        String errorStr = null;// 将原错误信息清空
        if (ipText.getText().trim().length() == 0) {
            errorStr = "IP不能为空!";
        }else if (hostText.getText().trim().length() == 0) {
            errorStr = "端口号不能为空!";
        }
        setErrorMessage(errorStr);// errorStr=null时复原为正常的提示文字
        setValid(errorStr == null);// “确定”按钮
        getApplyButton().setEnabled(errorStr == null);// “应用”按钮
    }

    // 父类方法。单击“复原默认值”按钮时将执行此方法,取出默认值设置到文本框中
    @Override
    protected void performDefaults() {
        ipText.setText(IP_DEFAULT);
        hostText.setText(HOST_DEFAULT);
        usernameText.setText(USERNAME_DEFAULT);
        passwordText.setText(PASSWORD_DEFAULT);
    }

    // 父类方法。单击“应用”按钮时执行此方法,将文本框值保存并弹出成功的提示信息
    @Override
    protected void performApply() {
        doSave(); // 自定义方法,保存设置
        new MsunStartUp().earlyStartup();
    }

    // 父类方法。单击“确定”按钮时执行此方法,将文本框值保存并弹出成功的提示信息
    @Override
    public boolean performOk() {
        doSave();
        new MsunStartUp().earlyStartup();
        return true; // true表示成功退出
    }

    // 自定义方法。保存文本框的值
    private void doSave() {
        ps.setValue(IP_KEY, ipText.getText());
        ps.setValue(HOST_KEY, hostText.getText());
        ps.setValue(USERNAME_KEY, usernameText.getText());
        ps.setValue(PASSWORD_KEY, passwordText.getText());
    }
}

需要注意的是,需要创建Activator类,然后在plugin.xml设置,当eclipse启动的时候,加载该类:

跟着实例学eclipse插件开发--第五篇:插件自动升级_第3张图片

Activator类代码如下:

package com.msun.plug.page;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

/**
 * @Title:插件开发
 * @Description:该类是初始化IPreferenceStore用的
 * @Copyright:MSun (c) 2018年9月7日
 * 
 * @author:-jiujiya
 * @version:1.0
 */
public class Activator extends AbstractUIPlugin {

	// The plug-in ID
	public static final String PLUGIN_ID = "upPlug"; //$NON-NLS-1$

	// The shared instance
	private static Activator plugin;

	/**
	 * The constructor
	 */
	public Activator() {
		plugin = this;
	}

	/**
	 * Returns the shared instance
	 *
	 * @return the shared instance
	 */
	public static Activator getDefault() {
		return plugin;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.
	 * BundleContext)
	 */
	@Override
	public void start(BundleContext context) throws Exception {
		super.start(context);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
	 */
	@Override
	public void stop(BundleContext context) throws Exception {
		plugin = null;
		super.stop(context);
	}

	public static ImageDescriptor getImageDescriptor(String path) {
		return imageDescriptorFromPlugin(PLUGIN_ID, path);
	}

}

源码下载地址:https://download.csdn.net/download/jiujiya123/10659447

(本教程是从一个项目中抽取出来的,可能会多引用了一些jar,另外Msun是以前项目名称,可自行修改)

你可能感兴趣的:(elipse插件开发)