支持多个版本的Eclipse

时间:2011-10-18 09:48:06

标签: eclipse eclipse-plugin dependencies version multiple-versions

我有一个Eclipse插件,我的目标是3.1或3.2作为支持的最低版本。问题是我的一些代码仅适用于3.5及更高版本(请参阅我的另一个问题:Is there an alternative to CaretListener in Eclipse?)。

既然我有旧版本的代码和不同版本的代码,那么只有当我的插件在3.5或更高版本中运行然后恢复到版本时才能调用新代码如果运行旧版本的旧代码?

作为一个测试,我创建了两个在其中具有相同类的插件(只做略有不同的事情)。我已经将 org.eclipse.ui 依赖关系标记为一个插件中的最小值为3.5,而将另一个插件中的最小值设置为3.1,但是我无法在旧版本中忽略依赖于3.5的依赖关系。版本...

有人可以帮忙吗?

谢谢, 艾伦

2 个答案:

答案 0 :(得分:2)

您可以使用org.eclipse.core.runtime.Platform获取org.eclipse.ui捆绑包并检查版本。

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

如果> = 3.5则注册MyListener,否则注册OldMyListener

修改

对,上述内容仅适用于捕获运行时行为的差异。

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框架的另一个选项是定义自己的扩展点,以便其他bundle的贡献可以决定使用哪个版本。基本上它与上面的模式相同,除了版本检查由插件上的依赖性范围完成,这有助于Executable运行。对于旧方法依赖于org.eclipse.ui [0.0.0,3.5.0],并简单地为当前方式指定org.eclipse.ui 3.5.0(这是3.5.0上的开放范围)。然后,您可以阅读您的扩展并实例化提供的类。

如果您正在为此创建额外的插件(对于2个差异稍微有点重),您可以在主插件中定义一个命令,并让额外的插件提供等效的处理程序。插件仍然必须具有依赖性范围,以便只有一个将加载&lt; 3.5或&gt; = 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中提取您需要的对象。

答案 1 :(得分:0)

听起来你应该提供两个插件,一个支持3.1版本到“正下方”3.5,另一个支持3.5以上。所以你真的没有选择,它基本上是Eclipse插件层,根据你的版本范围选择正确的插件层。

或者,如果您只提供已编译的类文件,那么当然您可以根据正在运行的Eclipse的版本动态加载所需的类。