Update Eclipse E4 application using p2

心已入冬 提交于 2019-12-08 04:00:33

问题


I'm adding an update feature in my Eclipse E4 application. Herefor I used the source code and tutorial from Lars Vogel. When I test my application the provisioningJob is always null. It should only be null when it run into Eclipse. But when I try to update my exported application the provisioningJob is still null. What I'm doing wrong?

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;
}

}


回答1:


P2 uses internally a lot of services and those are not explicitly referenced as bundle dependencies. So you might miss those additional required services. Adding them via the "Add required ..." inside PDE launches is not working. Make sure that your Launch or Product is really including all requirements.I would start with the content of org.eclipse.equinox.p2.sdk. This should definitely work. Afterwards you can try to strip the requirements down to org.eclipse.equinox.p2.core.feature or even less.



来源:https://stackoverflow.com/questions/40906455/update-eclipse-e4-application-using-p2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!