3

Eclipse 플러그인이 있으며 지원할 최소 버전으로 3.1 또는 3.2를 목표로합니다. 문제는 일부 코드는 버전 3.5 이상에서만 작동한다는 것입니다. 다른 질문 (Is there an alternative to CaretListener in Eclipse? 참조)을 참조하십시오.여러 버전의 Eclipse 지원

이전 버전에서 작동하는 코드와 최신 버전에서 작동하는 다른 코드가 있으므로 플러그인이 버전 3.5 이상에서 실행중인 경우에만 최신 코드를 호출 할 수있는 방법이 있습니까? 이전 코드를 실행하는 경우 이전 코드로 이동 하시겠습니까?

테스트에서 필자는 동일한 클래스를 가진 두 개의 플러그인을 만들었습니다. org.eclipse.ui 종속성을 하나의 플러그인에서 최소 3.5로 지정하고 다른 플러그인에서 3.1을 최소한으로 표시했습니다. 그러나 3.5에 의존하는 플러그인은 이전 버전에서 무시됩니다.

아무도 도와 줄 수 있습니까?

감사합니다, 앨런

+0

Eclipse 3.1/3.2? 나는 당신이 정말로 옛날 이클립스 버전을 지원해야하는지 스스로에게 물어야한다고 생각한다. 3.1이 2005 년에 나왔습니다. 일부 고객/클라이언트가 오래된 Eclipse 버전을 사용하고 있다면, 먼저 업그레이드 권장에 집중해야한다고 말하고 싶습니다. – Fredrik

+0

감사합니다. Fredrik, 나는 당신의 요점을 지키지 만, 버전 3.4는 2008 년에 나온 것입니다. 최소한 그것을 지원하는 것이 좋을 것입니다. 그래서, 문제가되는 유일한 의존성이기 때문에 가능한지 알아내는 것이 여전히 흥미로울 것입니다. –

답변

2

당신은 org.eclipse.ui 번들을 얻고 버전을 확인하기 위해 org.eclipse.core.runtime.Platform를 사용할 수 있습니다.

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

등록 MyListener> = 3.5의 경우, 그렇지 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); 

다른 번들의 기여가 사용하는 버전을 결정할 수 있도록 자신 만의 확장 점을 정의하는 것 이클립스 프레임 워크의 이상을 사용하는 또 다른 방법. 기본적으로 위와 같은 패턴이지만, 버전 확인은 플러그인의 종속 범위에 의해 수행되며 Executable이 실행됩니다. 기존 방식에서는 org.eclipse.ui [0.0.0,3.5.0]에 의존하고, 현재 방식에서는 org.eclipse.ui 3.5.0 (3.5.0에서는 끝나는 범위)을 지정합니다. 그런 다음 확장을 읽고 제공된 클래스를 인스턴스화 할 수 있습니다.

이 플러그인을 추가로 작성하는 경우 (2 가지 차이점이 조금 큼) 메인 플러그인에 명령을 정의하고 추가 플러그인이 해당 핸들러를 제공하도록 할 수 있습니다. 플러그인은 여전히 ​​의존성 범위를 가져야 만 < 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); 

그런 다음 핸들러의 구현 당신이 ExecutionEvent에서 필요한 객체를 추출하는 HandlerUtil.getVariable(event, "toAddListener")을 사용합니다.

+0

포스터를 올바르게 이해했다면 API 차이점에 대해 이야기하고 있었기 때문에 두 인터페이스 (상호 배타적 인 인터페이스)에 대해 컴파일해야 할 것입니다. – ShiDoiSi

+0

예, API 차이점에 대해 이야기하고 있었으며 런타임에 버전을 확인하는 것이 옵션이 아닙니다. 현재로서는 최소한 3.5로 지원을 중단했지만 다른 제안은 여전히 ​​감사 할 것입니다. –

0

두 개의 플러그인을 제공해야한다고 나에게 들립니다. 하나는 3.1 버전을 "3.5"바로 아래에, 다른 하나는 3.5 이상을 지원해야합니다. 따라서 실제로 선택할 수있는 것은 아닙니다. 기본적으로 Eclipse 플러그인 레이어는 버전 범위에 따라 올바른 플러그인 레이어를 선택합니다.

또는 컴파일 된 클래스 파일 만 제공하면 실행중인 Eclipse 버전 테스트를 기반으로 필요한 클래스를 동적으로로드 할 수 있습니다.