Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持Eclipse的多个版本_Eclipse_Eclipse Plugin_Dependencies_Version_Multiple Versions - Fatal编程技术网

支持Eclipse的多个版本

支持Eclipse的多个版本,eclipse,eclipse-plugin,dependencies,version,multiple-versions,Eclipse,Eclipse Plugin,Dependencies,Version,Multiple Versions,我有一个Eclipse插件,我的目标是将3.1或3.2作为支持的最低版本。问题是,我的一些代码只在3.5及以上版本中工作(请参阅我的另一个问题:) 现在我有了在旧版本中工作的代码和在新版本中工作的不同代码,有没有一种方法可以仅在我的插件运行在3.5或更高版本时调用新代码,然后在运行旧代码时恢复到旧代码 作为测试,我创建了两个插件,其中包含相同的类(只是做了一些稍微不同的事情)。我已经在一个插件中将org.eclipse.ui依赖项标记为至少3.5,在另一个插件中标记为至少3.1,但我无法在旧版本

我有一个Eclipse插件,我的目标是将3.1或3.2作为支持的最低版本。问题是,我的一些代码只在3.5及以上版本中工作(请参阅我的另一个问题:)

现在我有了在旧版本中工作的代码和在新版本中工作的不同代码,有没有一种方法可以仅在我的插件运行在3.5或更高版本时调用新代码,然后在运行旧代码时恢复到旧代码

作为测试,我创建了两个插件,其中包含相同的类(只是做了一些稍微不同的事情)。我已经在一个插件中将org.eclipse.ui依赖项标记为至少3.5,在另一个插件中标记为至少3.1,但我无法在旧版本中忽略依赖3.5的插件

有人能帮忙吗

谢谢,
Alan

您可以使用
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);

然后,处理程序的实现将使用
HandlerUtil.getVariable(event,“toAddListener”)
从ExecutionEvent提取所需的对象。

我觉得您应该提供两个插件,一个支持版本3.1到“刚好低于”3.5,另一个支持版本3.5以上。所以你不需要真正去选择,基本上是Eclipse插件层根据你的版本范围来选择正确的插件


或者,如果只提供已编译的类文件,那么当然可以在测试运行的Eclipse版本的基础上动态加载所需的类。

Eclipse3.1/3.2?我认为您应该首先问问自己是否真的需要支持旧的Eclipse版本。3.1于2005年出版。如果某个客户/客户正在使用这么旧的Eclipse版本,我会说,您应该首先关注鼓励他们升级。感谢Fredrik,我接受您的观点,但3.4版是在2008年才推出的-至少支持这一点是很好的。因此,我仍然很想知道这是否可能,因为这只是一个依赖性问题。如果我正确理解海报,他说的是API差异,因此他需要针对两个(互斥)接口进行编译。是的,我说的是API的差异,在运行时检查版本不是一个选项。目前,我已经同意至少支持3.5版本,但仍希望得到其他建议。
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);