2011-10-28 2 views
2

확장 포인트를 제공하는 기존 Eclipse 플러그인이 있습니다. 플러그인은 표준 Eclipse 메커니즘을 사용하여 확장을 찾습니다. 이 플러그인의 코드에서 다음 코드를 사용하여 확장 프로그램을 가져옵니다.기존 Eclipse 플러그인 확장자 덮어 쓰기

IConfigurationElement[] config = Platform.getExtensionRegistry() 
      .getConfigurationElementsFor(extensionPoint); 
if (config.length > 0) { 
    return config[0]; 
} 

코드에서 볼 수있는 것처럼 처음 발견 된 확장 프로그램 만 사용됩니다. 이 플러그인은 이미 확장 기능을 제공하며이 확장 기능은 기본 경우에 사용됩니다.

이제 기본 확장 기능의 동작을 재정의해야하므로 새 플러그인을 만들고 동일한 확장 점을 확장합니다. 그러나 기본 확장자는 항상 IConfigurationElement 배열의 첫 번째 확장이므로 항상 선택됩니다.

발견 된 IConfigurationElement 배열에 내 자신의 플러그인을 먼저 표시하려면 어떻게해야합니까? 그러면 기본 플러그인 대신 내 자신의 플러그인이 사용됩니까?

기존 플러그인은 다른 사람들이 작성했으며 절대적으로 필요하기 전까지는 변경하지 않으려합니다.

답변

1

나는 이것이 확장 점에서 확장을 얻는 나쁜 방법이라고 생각합니다. 플러그인 시스템을 사용하여 만든 특정 확장을로드하려는 경우 대신 getConfigurationElementsFor(String namespace, String extensionPointName, String extensionId) 메서드를 사용하고 다른 사용자가 확장 점을 사용할 가능성을 없앨 수 있습니다. 현재로서는 어떤 확장 프로그램을 사용할 지 알 수있는 확실한 방법이 없습니다. 기회가 될 것입니다. 나중에 확장 코드를 가져올 것으로 가정하고 나중에 확장을 얻지 못하면 ClassCastException이 문을 두드립니다. (한 번 시스템에서 이런 버그가 있었음)

물론 가장 좋은 방법은 코드를 변경하여 많은 확장을 처리하는 것입니다!

하지만 질문에; ExtensionRegistry가 배열을 채우는 방법을 모른다. API가 말하지 않는다. 아마도 배열에 첫 번째로 배치 할 수있는 특정 버전의 확장을 설정하는 방법이있을 수 있습니다. Extension이 어떻게 발견되는지 정확히 알기 위해서는 ExtensionRegistry의 코드를 살펴 봐야합니다. 나는 그것이 알파벳 순서일지도 모른다라고 생각한다. 그러나 확실하지 않은.

또 다른 방법은 기존 플러그인을 플러그인으로 오버로드하여 기능을 대체하는 것입니다. 매우 더러운 접근이지만 어떤 경우에는 가능합니다. See one of my questions regarding this

+2

ExtensionRegistry는 비 결정적인 방식으로 확장을 반환합니다. 즉 다른 컴퓨터에 다른 순서로 플러그인을 설치하면 먼저 우선 적용이 반환 될 수 있지만 보장 할 수는 없습니다. 소비자가 원하는 확장 기능을 정렬/우선 순위 지정/선택하는 것은 고객의 업무입니다. –

관련 문제