【问题标题】:NullPointerException in creating ProvisioningJob for headless update of eclipse rcp application为 Eclipse rcp 应用程序的无头更新创建 ProvisioningJob 时出现 NullPointerException
【发布时间】:2018-08-23 20:02:25
【问题描述】:

我正在实现 Eclipse 应用程序的无头强制更新。我使用了来自https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fp2_startup.htm 的P2Util 类,但我的代码在ProvisioningJob job = operation.getProvisioningJob(null); 返回空指针异常,作业对象即将到来null。有谁知道这个空对象的可能原因。

public class P2Util {
    // XXX Check for updates to this application and return a status.
    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);
        SubMonitor sub = SubMonitor.convert(monitor,
                "Checking for application updates...", 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));//null pointer here
            if (status.getSeverity() == IStatus.CANCEL)
                throw new OperationCanceledException();
        }
        return status;
    }
}

我调用这个方法如下。

private Integer checkUpdate(final String updateServerURL, final IProvisioningAgent provisioningAgent, ProgressMonitorSplash monitor) {
    returnValue = IApplication.EXIT_OK;

    final IRunnableWithProgress runnable = new IRunnableWithProgress() {
        @Override
        public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
            P2Util.addRepository(provisioningAgent, updateServerURL);
            final IStatus updateStatus = P2Util.checkForUpdates(provisioningAgent, monitor);
            if (updateStatus.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
                logger.debug("No Updates");
            } else if (updateStatus.getSeverity() != IStatus.ERROR) {
                logger.debug("Updates applied, attempting restart");
                returnValue = IApplication.EXIT_RESTART;
            } else {
                logger.error(updateStatus.getMessage());
            }
        }
    };
    try {
        monitor.run(true, runnable);
    } catch (final InvocationTargetException e) {
        e.printStackTrace();
    } catch (final InterruptedException e) {
        logger.error("interrupted: " + e.getMessage());
    }
    return returnValue;
}

我在哪里使用 EclipseContext 创建 ProvisingAgent

            final IEclipseContext localContext = EclipseContextFactory.getServiceContext(Activator.getContext());
            final IProvisioningAgent provisioningAgent = getService(localContext, IProvisioningAgent.class);
            String env = System.getProperty("env").toLowerCase();
            String repo = System.getProperty("validUrl." + env);
            if ( repo == null ){
                repo = System.getProperty("validUrl");
            }
            if ( repo != null ){
                ret = checkUpdate(repo, provisioningAgent, sp);
                if ( ret == IApplication.EXIT_RESTART ){
                    logger.info("Update successful, restarting...");
                    return ret;
                }
            }

【问题讨论】:

  • 当您运行测试(并获得空值)时,您是否将 eclipse 作为您用于开发的 eclipse 的运行时运行?或者您正在运行您的产品的构建版本? (例如在使用 Tycho 构建之后)
  • 我从 Eclipse 运行它。当我从 tycho 运行时,无论服务器是否发生变化,它总是返回 if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { return status; }
  • 您是否检查了启动配置的Configuration 选项卡底部的Support software installation in the launched application
  • 我刚查了一下,又测试了一遍,还是不行。但是那我该怎么用第谷呢。

标签: java eclipse eclipse-rcp


【解决方案1】:

UpdateOperation#getProvisioningJob(IProgressMonitor) 上的 javadoc 说:

 * @return a job that can be used to perform the provisioning operation.  This may be <code>null</code> 
 * if the operation has not been resolved, or if a plan could not be obtained when attempting to
 * resolve.  If the job is null and the operation has been resolved, then the resolution result 
 * will explain the problem.

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2015-09-12
    • 2018-03-08
    • 2019-11-07
    • 1970-01-01
    • 2017-09-13
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多