java - 使用 p2 更新 Eclipse E4 应用程序

标签 java eclipse-rcp updates e4 p2

我正在我的 Eclipse E4 应用程序中添加更新功能。为此,我使用了源代码和 tutorial来自拉尔斯·沃格尔。当我测试我的应用程序时,provisioningJob 始终为空。仅当运行到 Eclipse 中时它才应该为 null。但是当我尝试更新导出的应用程序时,provisioningJob 仍然为空。我做错了什么?

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 启动中的“添加所需...”添加它们不起作用。 确保您的启动或产品确实包含所有要求。我将从 org.eclipse.equinox.p2.sdk 的内容开始。这绝对应该有效。之后,您可以尝试将要求精简到 org.eclipse.equinox.p2.core.feature 甚至更少。

关于java - 使用 p2 更新 Eclipse E4 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40906455/

相关文章:

java - 在Java中查找字符串在字符串数组中的索引

java - RecyclerView使用AsyncTask分页制作重复页面?

java - 单击简介中的链接时,RCP 应用程序崩溃

java - 制作带有部分的编辑器页面不起作用(eclipse,java)

java - 在我的 Spring Hibernate 项目上获取 InvokingTargetException

java - 如何处理: Communication link failure

java - 如何通过代码创建扩展点的扩展而不是在plugin.xml中修改

javascript - 在 javascript 的更新序列中使用 mathjax

javascript - Redux reducer : Update object in array by key immutably

visual-studio - 在 Windows 上卸载 Xamarin