我有一个com.example.product
基于一个个人特性 ( com.example.feature
) 的个人 Eclipse RCP 产品 (),它由一个个人插件 ( com.example.plugin
) 和 Eclipse Helios (3.6) 中的一堆其他插件组成。我希望该应用程序检查更新并在必要时从 p2 站点进行更新。我希望它是无头的,即用户不会在更新过程中进行交互,但可能会在对话框中看到进度。
我基于RCP Mail 应用程序的更新实现。我稍微更改了P2Util.checkForUpdates
方法以包含一些日志记录,因此我可以看到那里出了什么问题(如果有的话):
static IStatus checkForUpdates(IProvisioningAgent agent,
IProgressMonitor monitor) throws OperationCanceledException,
InvocationTargetException {
ProvisioningSession session = new ProvisioningSession(agent);
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) {
try {
logger.info( "Status is " + status );
Update[] updates = operation.getPossibleUpdates();
for( Update u : updates){
logger.info( "Update is " + u );
}
ProvisioningJob job = operation.getProvisioningJob(null);
if( job == null ){
logger.error( "Provisioning Job is null" );
}
status = job.runModal(sub.newChild(100));
if (status.getSeverity() == IStatus.CANCEL) {
throw new OperationCanceledException();
}
} catch ( Exception e ){
logger.error( "Exception while trying to get updates", e);
}
}
return status;
}
我的功能中有一个p2.inf
文件与我的文件处于同一级别example.product
。它包含:
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository":
instructions.configure=\
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(type:0,location:file${#58}/C${#58}/workspace/updatesite/);\
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(type:1,location:file${#58}/C${#58}/workspace/updatesite/);
我使用设置为 1.0.0 的插件、功能和产品 ID 构建产品。我可以使用产品导出向导从 eclipse 中导出和运行我的产品。generate metadata repository
当我这样做时,我会 打勾。
Create an Update Site Project
我使用Feature Manfiest Editor 中的选项创建我的更新站点。我添加我的“com.example.feature”并构建它。只是为了看看它是否有效,我尝试通过 eclipse IDE 安装新软件选项浏览它,我可以在那里看到该功能。
我构建了更新站点,将所有 3 个 ID 更改为 1.0.1。当我启动应用程序时,它说没有要安装的更新,日志中没有错误。
我不知道为什么它没有从更新站点更新,但我想到的事情是:
1)我可能需要 p2.inf 文件中的更多信息,但我不确定是什么,可能是命名空间、名称和范围之类的,但我找不到一个好的实际示例。
2)在这种checkForUpdates
方法中,我可能需要对配置文件做一些事情来更改正在更新的可安装单元。同样,我只发现了暗示这一点的评论,而不是任何显示如何的示例代码。
在这里非常感谢任何提示或想法,这会占用很多时间。