好像利用Eclipse自定義擴(kuò)展點(diǎn)的人不多。
在我以前做的項(xiàng)目中,用了自定義擴(kuò)展點(diǎn),但是使用這個(gè)擴(kuò)展點(diǎn)的文件也在這個(gè)項(xiàng)目中,整個(gè)項(xiàng)目就是一個(gè)插件。所以,加載擴(kuò)展點(diǎn)的方式很簡(jiǎn)單:
1
IExtensionRegistry registry = Platform.getExtensionRegistry();
2
IExtensionPoint point = registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
3
IExtension[] extensions = point.getExtensions();
4
for (int i = 0; i < extensions.length; i++)
{
5
IConfigurationElement[] elements = extensions.getConfigurationElements();
6
for (int j = 0; j < elements.length; j++)
{
7
String eleType = elements[j].getName();
8
Class importantClass = Class.forName(element[j].getAttribute(MyConstants.ATTR_MODELCLASS)).newInstance();
9
……
10
}
11
}

2

3

4



5

6



7

8

9

10

11

在一個(gè)插件項(xiàng)目中,這樣的代碼一點(diǎn)問(wèn)題都沒(méi)有。
但是,我現(xiàn)在的項(xiàng)目分為幾個(gè)插件,擴(kuò)展點(diǎn)的定義放在了插件項(xiàng)目A中,相關(guān)的接口和擴(kuò)展點(diǎn)實(shí)現(xiàn)收集器(這是我自己取的名字)也在A中,但是擴(kuò)展點(diǎn)的實(shí)現(xiàn)是其他的插件,比如插件B就實(shí)現(xiàn)了A中定義的擴(kuò)展點(diǎn)。那么他們之間的依賴(lài)關(guān)系是
A <---------- B
換句話說(shuō),在A中看不到B中的代碼,那么問(wèn)題就來(lái)了:上面那段代碼的第8行將會(huì)報(bào)出class not found的異常。
如何解決這個(gè)問(wèn)題?
可能是我對(duì)Eclipse的核心代碼太不熟悉了,所以這個(gè)問(wèn)題困擾了我很久。
解決的方法是,將第8行替換為

這個(gè)方法將激活本次實(shí)現(xiàn)所在的插件項(xiàng)目的Bundle,問(wèn)題就解決了。