سؤال

لدي منتج شخصي لـ Eclipse RCP (com.example.product) بناءً على ميزة شخصية واحدة (com.example.feature) الذي يتكون من مكون إضافي واحد (com.example.plugin) وحفنة من الآخرين من Eclipse Helios (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/);

أقوم ببناء المنتج باستخدام البرنامج المساعد والميزات ومعرفات المنتج إلى 1.0.0. يمكنني تصدير المنتج الخاص بي وتشغيله من Eclipse باستخدام معالج تصدير المنتج. أنا علامة generate metadata repository عندما أفعل هذا.

أقوم بإنشاء موقع التحديث الخاص بي باستخدام Create an Update Site Project الخيار في ميزة Manfiest Editor. أقوم بإضافة `com.example.feature" وأبنيها. فقط لمعرفة ما إذا كان يعمل ، أحاول تصفحه عبر Eclipse IDE ، قم بتثبيت خيار برنامج جديد ويمكنني رؤية الميزة هناك.

أقوم بإنشاء موقع التحديث مع تم تغيير جميع المعرفات الثلاثة إلى 1.0.1. عندما أبدأ التطبيق ، تقول أنه لا توجد تحديثات للتثبيت ، لا توجد أخطاء في السجلات.

لا أعرف لماذا لا يتم تحديثه من موقع التحديث ، لكن الأشياء التي تجاوزت ذهني هي:

1) قد أحتاج إلى مزيد من المعلومات في ملف p2.inf ، لكنني لست متأكدًا ، ربما ، ربما شيء مثل مساحة الاسم والاسم والنطاق ، لكن لا يمكنني العثور على مثال عملي جيد.

2) في ال checkForUpdates قد أحتاج إلى القيام بشيء ما مع ملفات تعريف لتغيير الوحدات القابلة للتثبيت التي يتم تحديثها. مرة أخرى ، لم أجد سوى تعليقات تلمس إلى هذا وليس أي رمز مثال يوضح كيف.

أي تلميحات أو أفكار موضع تقدير كبير هنا ، وهذا يأكل الكثير من الوقت.

هل كانت مفيدة؟

المحلول 2

كان إجابة @user473284 بعض الاقتراحات التي استخدمتها ولكن لا أعرف ما إذا كانت متطلبات محددة

1) استخدام خادم ويب محلي بدلاً من محاولة الإشارة إلى ملف 2) زيادة إصدار المنتج واستخدام مستودع التحديث الذي تم إنشاؤه بواسطة معالج منتج التصدير.

لم أجد أبدًا تطبيق طريقة getUpdate المشار إليها من عينة الكود ، لذا لم أتمكن من الاستفادة من المقتطف.

بعد التغييرات المذكورة أعلاه ، ما زلت تركت مع عدم وجود أي تحديثات على بدء التشغيل. أظهر تصحيح الأخطاء أن مستودعي لم يكن يظهر في الجلسة. اضطررت إلى إضافة عنوان URL للتحديث بشكل صريح في الكود ، على الرغم من وجوده في P2.inf وفي مجموعة نموذج محرر Meature Meashest. هذا هو الرمز لهذا:

    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

نصائح أخرى

انظر إلى هذا الرمز. أعد بناء منتجك بإصدار منتج جديد وحاول إعداد خادم HTTP. لم تعمل مع ملف repo بالنسبة لي. مجرد نشر الميزة لن تعمل.

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) {
}
}
});
  1. خادم الويب ليس إلزاميًا ، يمكنك الحصول على تحديثات مع موقع الملف.
  2. من الضروري تغيير إصدار المنتج أيضًا.
  3. لا يمكنك تحديث هذه الميزات باستخدام إنشاء مشروع تحديث موقع تم تصديره بالمنتج ، ولكن يمكنك القيام بذلك مع بعض القرصنة في المنتجات المصدرة.
  4. إذا قمت بإضافة بعض الميزات الأخرى باستخدام خيار (تثبيت برامج جديدة) ، فيمكنك تحديث هذه الميزات مع إنشاء مشروع تحديث موقع الموقع.

نأمل أن يكون هذا مفيدًا. إذا كنت بحاجة إلى مزيد من التوضيح يمكنك أن تسأل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top