У меня есть персональный продукт Eclipse RCP (com.example.product
), основанный на одной персональной функции (com.example.feature
), которая состоит из одного личного плагина (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.Я могу экспортировать и запустить свой продукт из Eclipse, используя мастер экспорта продукта.Я отмечаю generate metadata repository
, когда я делаю это.
Я создаю свой сайт обновлений, используя опцию Create an Update Site Project
в Редакторе функций Manfiest.Я добавляю свой com.example.feature и собираю его.Просто чтобы посмотреть, работает ли он, я пытаюсь просмотреть его с помощью опции «Установить новое программное обеспечение» в eclipse IDE, и я вижу там функцию.
Я создаю сайт обновления со всеми 3 идентификаторами, измененными на 1.0.1.Когда я запускаю приложение, оно говорит, что нет обновлений для установки, в журналах нет ошибок.
Я не знаю, почему оно не обновляется с сайта обновлений, но что-то пересекало мойпомните:
1) Мне может понадобиться больше информации в файле p2.inf, но я не уверен, что, может быть, что-то вроде пространства имен, имени и диапазона, но я могунайти хороший практический пример.
2) В методе checkForUpdates
мне может понадобиться что-то сделать с профилями, чтобы изменить обновляемые устанавливаемые модули.Опять же, я нашел только комментарии, намекающие на это, а не пример кода, который показывает, как.
Любые советы или идеи очень ценятся здесь, это отнимает много времени.