Поддержка нескольких версий Eclipse - PullRequest
3 голосов
/ 18 октября 2011

У меня есть плагин Eclipse, и я стремлюсь к 3.1 или 3.2 как минимальной версии для поддержки. Проблема в том, что часть моего кода работает только в версии 3.5 и выше (см. Мой другой вопрос: Есть ли альтернатива CaretListener в Eclipse? ).

Теперь, когда у меня есть код, который работает в более старых версиях, и другой код, который работает в более новых версиях, есть ли способ, которым я могу вызвать более новый код, только если мой плагин работает в версии 3.5 или выше, а затем вернуться к старый код, если работает что-то старше?

В качестве теста я создал два плагина с одним и тем же классом (просто делаю немного разные вещи). Я пометил зависимость org.eclipse.ui как минимум 3.5 в одном плагине и 3.1 как минимум в другом, но я не могу получить тот, который опирается на 3.5, чтобы игнорироваться в более старых версиях ...

Может кто-нибудь помочь?

Спасибо, Alan

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Вы можете использовать org.eclipse.core.runtime.Platform, чтобы получить org.eclipse.ui Bundle и проверить версию.

Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
// then do something with that

Зарегистрируйте MyListener, если> = 3,5, и OldMyListener в противном случае.

EDIT:

Да, вышесказанное подходит только для определения различий в поведении во время выполнения.

Eclipse поддерживает несколько приемов для загрузки только некоторых классов.

Самый простой с точки зрения разработки трюк, о котором упоминал @ShiDoiSi.

Bundle myBundle = org.osgi.framework.FrameworkUtil.getBundle(this.class);
Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
Version cutOff = new Version(3,5,0);
final Executable processListener;
if (ui.compareTo(cutOff)<0) {
    Class pc = myBundle.loadClass("my.pkg.OldListenerProcess");
    processListener = (Executable) pc.newInstance();
} else {
    Class pc = myBundle.loadClass("my.pkg.ListenerProcess");
    processListener = (Executable) pc.newInstance();
}
processListener.execute(targetObject);

Другой вариант, который использует больше инфраструктуры eclipse, - это определение вашей собственной точки расширения, чтобы вклады из других пакетов могли решить, какую версию использовать. По сути, это тот же шаблон, что и выше, за исключением того, что проверка версии выполняется с помощью диапазонов зависимостей плагина, которые способствуют запуску Executable. Зависит от org.eclipse.ui [0.0.0,3.5.0) для старого способа и просто указывает org.eclipse.ui 3.5.0 (это открытый диапазон на 3.5.0) для текущего пути. Затем вы можете прочитать ваше расширение и создать экземпляр класса.

Если вы создаете дополнительные плагины для этого (немного тяжелый вес для двух отличий), вы можете определить команду в вашем основном плагине и сделать так, чтобы дополнительные плагины обеспечивали эквивалентный обработчик. Плагины по-прежнему должны иметь диапазоны зависимостей, чтобы только один из них загружался для случая <3.5 или> = 3.5. Затем, используя командный API, вы можете выполнить команду (и запустится правильный обработчик).

ICommandService cmdS 
  = (ICommandService) workbenchWindow.getService(ICommandService.class);
Command process = cmdS.getCommand("my.pkg.ListenerProcess");
ParameterizedCommand cmd = new ParameterizedCommand(process, null);
IHandlerService handlerS 
  = (IHandlerService) workbenchWindow.getService(IHandlerService.class);
IEvaluationContext ctx = handlerS.createContextSnapshot(false);
ctx.addVariable("toAddListener", targetObject);
handlerS.executeCommandInContext(cmd, null, ctx);

Тогда ваша реализация обработчика будет использовать HandlerUtil.getVariable(event, "toAddListener") для извлечения нужного объекта из ExecutionEvent.

0 голосов
/ 28 октября 2011

Мне кажется, что вы должны поставить два плагина, один из которых поддерживает версию 3.1 для «чуть ниже» 3.5, а другой - от 3.5 и выше.Так что вам на самом деле не нужно выбирать, это в основном слой плагинов Eclipse, который выбирает правильный в зависимости от диапазона версий.

Или, если вы предоставляете только скомпилированные файлы классов, тогда, конечно, вы можете загрузить требуемыеКласс динамически основан на тестировании версии работающего Eclipse.

...