我有一个基于个人特性(com.example.product)的个人Eclipse产品(com.example.feature),它由一个个人插件(com.example.plugin)和Eclipse (3.6)中的其他一些插件组成。我希望应用程序检查更新和更新,如果必要的话,从p2网站。我希望它是无头的,即用户在更新过程中不进行交互,但可能在对话框中看到进展。
我的更新实现基于RCP邮件应用程序。我稍微修改了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/);我将插件、功能和产品I设置为1.0.0来构建该产品。我可以使用产品导出向导从eclipse导出和运行我的产品。当我这样做的时候,我在generate metadata repository上打勾。
我在Feature中使用Create an Update Site Project选项创建我的更新站点。我添加我的`com.example.feature‘并构建它。为了看它是否有效,我尝试通过eclipse安装新软件选项来浏览它,我可以在那里看到它的特性。
我构建更新站点时,所有3个I都更改为1.0.1。当我启动应用程序时,它说没有要安装的更新,日志中没有错误。
我不知道它为什么不从更新站点更新,但我想到的事情是:
1)我可能需要p2.inf文件中的更多信息,但我不确定是什么,比如名称空间、名称和范围,但我找不到一个很好的实际例子。
2)在checkForUpdates方法中,我可能需要使用配置文件来更改正在更新的可安装单元。同样,我只发现一些注释暗示了这一点,而没有任何示例代码显示了如何。
任何暗示或想法在这里都是非常感谢的,这是吃了很多时间。
发布于 2010-10-15 18:11:07
@ used 473284的答案有一些我使用过的建议,但我不知道它们是否是明确的要求。
1)使用本地web服务器而不是试图指向文件2)递增产品版本并使用导出产品向导生成的更新存储库。
我从未从代码示例中找到getUpdate方法的实现,因此无法使用代码片段。
在上面的更改之后,我仍然保留着应用程序,在启动时没有发现任何更新。调试表明,会话中没有显示我的存储库。我必须显式地在代码中添加更新url,尽管它在p2.inf中和在Feature清单编辑器表单字段中设置。以下是此代码:
public static void addUpdateSite(IProvisioningAgent provisioningAgent)
throws InvocationTargetException {
// Load repository manager
IMetadataRepositoryManager metadataManager = (IMetadataRepositoryManager) provisioningAgent
.getService(IMetadataRepositoryManager.SERVICE_NAME);
if (metadataManager == null) {
logger.error( "Metadata manager was null");
Throwable throwable = new
Throwable("Could not load Metadata Repository Manager");
throwable.fillInStackTrace();
throw new InvocationTargetException(throwable);
}
// Load artifact manager
IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) provisioningAgent
.getService(IArtifactRepositoryManager.SERVICE_NAME);
if (artifactManager == null) {
logger.error( "Artifact manager was null");
Throwable throwable = new Throwable(
"Could not load Artifact Repository Manager");
throwable.fillInStackTrace();
throw new InvocationTargetException(throwable);
}
// Load repo
try {
URI repoLocation = new URI("http://localhost/respository");
logger.info( "Adding repository " + repoLocation );
metadataManager.loadRepository(repoLocation, null);
artifactManager.loadRepository(repoLocation, null);
} catch (ProvisionException pe) {
logger.error( "Caught provisioning exception " + pe.getMessage(), pe);
throw new InvocationTargetException(pe);
} catch (URISyntaxException e) {
logger.error( "Caught URI syntax exception " + e.getMessage(), e);
throw new InvocationTargetException(e);
}
}现在,我从最初的问题中调用checkForUpdates方法中的第一件事。在这个改变之后,我的应用程序至少现在看到了更新并尝试安装它。我仍然有问题,但这是我在https://stackoverflow.com/questions/3944953/error-during-p2-eclipse-rcp-app-headless-update创建的一个独立的问题。
发布于 2010-10-12 11:33:24
看看这段代码。使用新产品版本重新生成产品,并尝试设置http服务器。它不适用于我的档案回购。仅仅发布这个特性是行不通的。
final IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
sub = SubMonitor.convert(monitor, Messages.getString("UpdateManager.searchforupdates"), 200); //$NON-NLS-1$
final Update update = getUpdate(profile, provisioningContext, engine, context);
status = operation.resolveModal(sub.newChild(100));
LogHelper.log(status);
if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
status = null;
return;
}
if (status.getSeverity() == IStatus.CANCEL)
throw new OperationCanceledException();
if (status.getSeverity() != IStatus.ERROR) {
log(IStatus.INFO, "Checking for available update matches", null); //$NON-NLS-1$
Update[] selected = new Update[1];
operation.setSelectedUpdates(new Update[0]);
for (Update available : operation.getPossibleUpdates()) {
if (available.equals(update)) {
log(IStatus.INFO, "Update matches available: " + update, null); //$NON-NLS-1$
selected[0] = available;
operation.setSelectedUpdates(selected);
}
}
if (selected[0] == null) {
status = null;
monitor.setCanceled(true);
log(IStatus.WARNING, "No Update matches selected", null); //$NON-NLS-1$
return;
}
ProvisioningJob job = operation.getProvisioningJob(monitor);
if (job != null) {
status = job.runModal(sub.newChild(100));
if (status.getSeverity() != IStatus.ERROR) {
prefStore.setValue(JUSTUPDATED, true);
Display.getDefault().syncExec(new Runnable() {
public void run() {
PlatformUI.getWorkbench().restart();
}
});
} else {
LogHelper.log(status);
}
} else {
log(IStatus.INFO, "getJob returned null", null); //$NON-NLS-1$
status = null;
}
if (status != null && status.getSeverity() == IStatus.CANCEL)
throw new OperationCanceledException();
}
}
};
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
new ProgressMonitorDialog(null).run(true, true, runnable);
} catch (InvocationTargetException x) {
log(IStatus.ERROR, "Runnable failure", x); //$NON-NLS-1$
} catch (InterruptedException e) {
}
}
});发布于 2013-08-13 07:20:09
希望这会有帮助。如果你需要更多的澄清,你可以问。
https://stackoverflow.com/questions/3911014
复制相似问题