eclipse rcp 需要增加自动update功能,希望使用Equinox P2的api来做相应的自动启动更新,不需要用户的干预.
参考:https://wiki.eclipse.org/Equinox/p2/Adding_Self-Update_to_an_RCP_Application
查看官方文档,下载git代码,就是跑不通.
偶尔发现一片文章:http://javaarm.com/faces/display.xhtml?tid=3455&page=1
讲的非常详细,一步一步下来,基本上实现了菜单更新.
下面需要实现无干预的更新,
参考:http://www.vogella.com/tutorials/EclipseP2Update/article.html#tutorial_updatelocation
最终实现代码如下:
ApplicationWorkbenchWindowAdvisor:
package com.xsej.office; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.core.helpers.LogHelper; import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.operations.UpdateOperation; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import com.xsej.office.utils.P2Util; public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { private static final String JUSTUPDATED = "justUpdated"; public ApplicationWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) { super(configurer); } public ActionBarAdvisor createActionBarAdvisor( IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); int screenWidth = Display.getCurrent().getBounds().width; int screenHeight = Display.getCurrent().getBounds().height; configurer.setInitialSize(new Point(screenWidth, screenHeight)); configurer.setShowCoolBar(true); configurer.setShowStatusLine(true); configurer.setShowProgressIndicator(true); configurer.setTitle("example"); } public void postWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); configurer.getWindow().getShell().setMaximized(true); final IProvisioningAgent agent = (IProvisioningAgent) ServiceHelper .getService(Activator.bundleContext, IProvisioningAgent.SERVICE_NAME); if (agent == null) { LogHelper .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "No provisioning agent found. This application is not set up for updates.")); } // XXX if we're restarting after updating, don't check again. final IPreferenceStore prefStore = Activator.getDefault() .getPreferenceStore(); if (prefStore.getBoolean(JUSTUPDATED)) { prefStore.setValue(JUSTUPDATED, false); return; } // XXX check for updates before starting up. // If an update is performed, restart. Otherwise log // the status. IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IStatus updateStatus = P2Util.checkForUpdates(agent, monitor); if (updateStatus.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { // PlatformUI.getWorkbench().getDisplay() // .asyncExec(new Runnable() { // public void run() { // MessageDialog.openInformation(null, "提示", // "已经是最新版本"); // } // }); } else if (updateStatus.getSeverity() != IStatus.ERROR) { prefStore.setValue(JUSTUPDATED, true); PlatformUI.getWorkbench().getDisplay() .asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(null, "提示", "更新完成,现在重启"); PlatformUI.getWorkbench().restart(); } }); // PlatformUI.getWorkbench().restart(); } else { LogHelper.log(updateStatus); } } }; try { new ProgressMonitorDialog(null).run(true, true, runnable); } catch (InvocationTargetException e) { e.printStackTrace(); LogUtil.log(this.getClass(),e.toString() ); } catch (InterruptedException e) { e.printStackTrace(); LogUtil.log(this.getClass(),e.toString() ); } catch (Exception e) { e.printStackTrace(); LogUtil.log(this.getClass(),e.toString() ); } } public boolean preWindowShellClose() { return true; } }
P2Util:
package com.xsej.office.utils; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.operations.ProvisioningJob; import org.eclipse.equinox.p2.operations.ProvisioningSession; import org.eclipse.equinox.p2.operations.UpdateOperation; public class P2Util { private static final String REPOSITORY_LOC = System.getProperty( "P2Util.Repo", "http://127.0.0.1:8080/repository"); // XXX Check for updates to this application and return a status. public static IStatus checkForUpdates(IProvisioningAgent agent, IProgressMonitor monitor) throws OperationCanceledException { ProvisioningSession session = new ProvisioningSession(agent); // the default update operation looks for updates to the currently // running profile, using the default profile root marker. To change // which installable units are being updated, use the more detailed // constructors. UpdateOperation operation = new UpdateOperation(session); configureUpdate(operation); SubMonitor sub = SubMonitor.convert(monitor, "正在检查更新...", 200); IStatus status = operation.resolveModal(sub.newChild(100)); if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { return status; } if (status.getSeverity() == IStatus.CANCEL) throw new OperationCanceledException(); if (status.getSeverity() != IStatus.ERROR) { // More complex status handling might include showing the user what // updates // are available if there are multiples, differentiating patches vs. // updates, etc. // In this example, we simply update as suggested by the operation. ProvisioningJob job = operation.getProvisioningJob(null); status = job.runModal(sub.newChild(100)); if (status.getSeverity() == IStatus.CANCEL) throw new OperationCanceledException(); } return status; } private static UpdateOperation configureUpdate( final UpdateOperation operation) { // create uri and check for validity URI uri = null; try { uri = new URI(REPOSITORY_LOC); } catch (final URISyntaxException e) { return null; } LogUtil.log("更新地址:"+uri.toString() ); // set location of artifact and metadata repo operation.getProvisioningContext().setArtifactRepositories( new URI[] { uri }); operation.getProvisioningContext().setMetadataRepositories( new URI[] { uri }); return operation; } }
总结:
1.构建整理,原来只是一个plugin工程,但是最后演变成三个工程,原来的plugin工程,feature工程,product工程.
主要p2需要针对feature进行update.
2.自动更新需要使用equinox p2的api进行无干预更新,那么在plugin中就需要导入相关的插件
org.eclipse.equinox.p2.core |
Core p2 functionality |
org.eclipse.equinox.p2.engine |
The engine carries out the provisioning operation. |
org.eclipse.equinox.p2.operations |
Layer over the core and engine API to describe updates as an atomic install. |
org.eclipse.equinox.p2.metadata.repository |
Contains the definition of p2 repositories. |
需要添加另外更新需要使用的插件;
org.eclipse.equinox.p2.touchpoint.natives
org.eclipse.equinox.p2.transport.ecf
在feature中包含整个p2的featrue包
org.eclipse.equinox.p2.core.feature |
Feature containing the p2 bundles. |
开发过程因为没有加入org.eclipse.equinox.p2.metadata.repository,导致无法下载新的版本,但是日志没有任何显示,浪费很多时间
相关推荐
Eclipse Rcp启动时使用p2自动更新,不使用P2的ui,一步一步指导搭建,核心代码直接包含在文档里面。
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它提供了一整套工具和...同时,持续关注Eclipse RCP的更新和社区支持,可以帮助你更好地利用这个平台的优势,提升开发效率和用户体验。
Eclipse RCP,全称Eclipse Rich Client Platform,是一个基于Java的框架,用于构建桌面应用程序。这个框架由Eclipse基金会维护,是Eclipse IDE的一部分,允许开发者创建功能丰富的、可扩展的应用程序,拥有类似IDE的...
Eclipse RCP,全称Eclipse Rich Client Platform,是一种基于Java的开源框架,用于构建桌面应用程序。它由Eclipse基金会维护,是Eclipse IDE的核心组成部分,提供了丰富的UI组件、插件系统以及工作台(Workbench)...
eclipse RCP Plug-in开发自学教程 eclipse RCP(Rich Client Platform)是一种基于eclipse的插件式开发平台,允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序。RCP插件式开发方式可以重用eclipse中的方法...
Eclipse RCP 教程 Eclipse RCP(Rich Client Platform)是一种基于 Eclipse 平台的客户端开发技术,能够帮助开发者快速构建功能强大且界面美观的桌面应用程序。在本教程中,我们将详细介绍 Eclipse RCP 的开发过程...
### Eclipse RCP 入门详解 #### 一、Eclipse RCP 概述 **Eclipse RCP**(Rich Client Platform)是一种构建丰富客户端应用程序的框架,它利用Eclipse平台的强大功能来创建高度定制化的桌面应用程序。通过RCP,...
Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许开发者创建独立于Eclipse环境的Java桌面应用程序。RCP通过提供一套标准组件和API,简化了桌面应用程序的开发流程,使开发者能够专注于业务逻辑而非界面...
Eclipse RCP(Rich Client Platform)是Eclipse IDE的一个核心组成部分,它提供了一个框架和工具集,用于构建桌面应用程序。Eclipse RCP允许开发者利用Java和SWT(Standard Widget Toolkit)构建功能丰富的、可定制...
【标题】"eclipse RCP mp3工程"指的是一个基于Eclipse Rich Client Platform(RCP)构建的专门处理MP3音频文件的应用程序。Eclipse RCP是一个强大的开发框架,允许开发者创建桌面应用,它提供了丰富的用户界面组件和...
10. **部署与打包**:最后,学习如何将Eclipse RCP应用打包成可执行的RCP产品,包括生成启动配置、设置依赖关系等。 通过对“Eclipse RCP 例子程序”的深入学习和实践,开发者不仅可以掌握Eclipse RCP的基本使用,...
《ECLIPSE+RCP应用系统开发方法与实战》这本书是高岗先生关于使用Eclipse RCP(Rich Client Platform)进行应用系统开发的一本实战指南。Eclipse RCP是Eclipse IDE的一部分,它提供了一个框架,使得开发者可以构建...
10. **RCP应用生命周期**:从启动到关闭,Eclipse RCP应用有一套完整的生命周期管理,包括启动配置、初始化、运行以及退出阶段。 11. **插件开发**:开发Eclipse RCP应用涉及创建插件项目、定义插件依赖、编写插件...
### Eclipse RCP 插件开发指南 #### Eclipse RCP Plugin 开发快速入门 Eclipse RCP(Rich Client Platform)插件开发是构建基于Eclipse框架的应用程序的核心技术之一。本指南旨在帮助开发者从零开始掌握Eclipse ...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序,它基于Java语言并利用了Eclipse IDE的核心技术。Eclipse RCP允许开发者创建功能丰富的、可扩展的应用程序,这些应用程序拥有与Eclipse...
在Eclipse RCP中,应用程序是由一系列插件组成的,每个插件都可以独立地进行开发、部署和更新。 Eclipse RCP的核心特性之一是它的灵活性和可扩展性。这种灵活性体现在多个方面,例如通过插件机制可以轻松地添加新...
《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自执笔,并得到了Eclipse官方技术社区的强烈推荐,权威性毋庸置疑!内容全面,系统讲解了利用Eclipse RCP和Spring OSGi开发大规模Java应用的...
Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它基于Java,由Eclipse基金会维护,是Eclipse IDE的核心组成部分。RCP允许开发者利用已有的插件系统构建可定制、模块化的应用,具有...
最后,Eclipse RCP还支持自定义的部署和更新机制,使得应用能够动态地下载和安装新版本或插件。这对持续交付和持续集成有着重要意义。 总的来说,"菜鸟Eclipse RCP学习之路"是一段充满挑战和收获的旅程,涵盖了从...
1. **创建RCP应用**:启动Eclipse IDE后,在“File”菜单下选择“New” > “Other”,然后选择“Plug-in Development”类别下的“Rich Client Application”。按照向导完成必要的设置,包括应用程序的名称、ID等。 ...