使用p2更新Eclipse E4应用程序

我正在Eclipse E4应用程序中添加更新function。 为此,我使用了Lars Vogel的源代码和教程 。 当我测试我的应用程序时,provisioningJob始终为null。 它在运行Eclipse时应该只为null。 但是当我尝试更新导出的应用程序时,provisioningJob仍然为null。 我做错了什么?

public class UpdateHandler { private static final String REPOSITORY_LOC = System.getProperty("UpdateHandler.Repo", "file:////updateServer/repository"); @Execute public void execute(final IProvisioningAgent agent, final Shell shell, final UISynchronize sync, final IWorkbench workbench) { Job updateJob = new Job("Update Job") { @Override protected IStatus run(final IProgressMonitor monitor) { return checkForUpdates(agent, shell, sync, workbench, monitor); } }; updateJob.schedule(); } private IStatus checkForUpdates(final IProvisioningAgent agent, final Shell shell, final UISynchronize sync, final IWorkbench workbench, IProgressMonitor monitor) { // configure update operation final ProvisioningSession session = new ProvisioningSession(agent); final UpdateOperation operation = new UpdateOperation(session); configureUpdate(operation); // check for updates, this causes I/O final IStatus status = operation.resolveModal(monitor); // failed to find updates (inform user and exit) if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { LogModule.log(LogLevel.INFO, "No updated has been found"); showMessage(shell, sync); return Status.CANCEL_STATUS; } else { LogModule.log(LogLevel.INFO, "Updates are found"); } // run installation final ProvisioningJob provisioningJob = operation.getProvisioningJob(monitor); // updates cannot run from within Eclipse IDE!!! if (provisioningJob == null) { System.err.println("Trying to update from the Eclipse IDE? This won't work!"); LogModule.log(LogLevel.WARNING, "Trying to update from the Eclipse IDE? This won't work!"); return Status.CANCEL_STATUS; } configureProvisioningJob(provisioningJob, shell, sync, workbench); //provisioningJob.schedule(); provisioningJob.run(monitor); return Status.OK_STATUS; } private void configureProvisioningJob(ProvisioningJob provisioningJob, final Shell shell, final UISynchronize sync, final IWorkbench workbench) { // register a job change listener to track // installation progress and notify user upon success provisioningJob.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent event) { //if (event.getResult().isOK()) { sync.syncExec(new Runnable() { @Override public void run() { LogModule.log(LogLevel.INFO, "Update ready to install"); boolean restart = MessageDialog.openQuestion(shell, "Updates installed, restart?", "Updates have been installed. Do you want to restart?"); if (restart) { workbench.restart(); } } }); // } super.done(event); } }); } private void showMessage(final Shell parent, final UISynchronize sync) { sync.syncExec(new Runnable() { @Override public void run() { MessageDialog.openWarning(parent, "No update", "No updates for the current installation have been found."); } }); } private UpdateOperation configureUpdate(final UpdateOperation operation) { // create uri and check for validity URI uri = null; try { uri = new URI(REPOSITORY_LOC); } catch (final URISyntaxException e) { System.err.println(e.getMessage()); LogModule.log(LogLevel.ERROR, e.getMessage()); return null; } // set location of artifact and metadata repo operation.getProvisioningContext().setArtifactRepositories(new URI[] { uri }); operation.getProvisioningContext().setMetadataRepositories(new URI[] { uri }); return operation; } 

}

P2在内部使用了大量服务,并且未将这些服务显式引用为bundle依赖项。 所以你可能会错过那些额外的必需服务。 通过PDE启动中的“Add required …”添加它们不起作用。 确保您的Launch或Product确实包含所有要求。我将从org.eclipse.equinox.p2.sdk的内容开始。 这绝对有用。 之后,您可以尝试将需求删除到org.eclipse.equinox.p2.core.feature甚至更少。