本文为大家讲解实现插件的自动升级功能,首先需要搭建一个ftp服务器,将最新的插件放到ftp指定位置:
Eclipse启动时,通过ftp查看插件最新版本,如果和本地版本不一样,就下载最新版本。首次启动时,需要设置ftp基础属性:
本文涉及到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启动的时候,加载该类:
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是以前项目名称,可自行修改)