2013-07-11 13 views
6

Chciałbym wiedzieć, co to jest "Aktywuj tę wtyczkę, gdy jedna z jej klas jest załadowana" w oknie edytora Eclipse przydatne dla.Leniwa aktywacja wtyczek Eclipse

Uważam, że Eclipse zawsze stosuje podejście "leniwej inicjalizacji". Czy ta opcja ma związek z klasą wtyczki BundleActivator? inicjuje coś innego niż aktywacja?

Here to podobne pytanie, ale nie rozumiem tego w całości.

Odpowiedz

15

Zaznaczenie pola powoduje, że następujący nagłówek być ustawione w manifeście:

Bundle-ActivationPolicy: lazy 

Zacznę jaki sposób „czystych” zajmuje OSGi z tym. JEŻELI pakiet zostanie uruchomiony z flagą START_ACTIVATION_POLICY, pakiet wejdzie w stan STARTING, ale metoda start() aktywatora nie zostanie wywołana, a klasa Classoader nie zostanie przydzielona dla pakietu. Pakiet pozostaje w URUCHOMIENIU, dopóki z jakiegoś powodu klasa nie zostanie załadowana z pakietu. W tym momencie przydzielana jest klasa ClassLoader, a aktywator (jeśli występuje) jest instancjonowany, a jego metoda start() jest wywoływana przed załadowaniem żądanej klasy.

Jednak warstwy Eclipse tworzą dodatkową semantykę u góry. Jako tło, Eclipse zawsze stara się unikać uruchamiania pakietów, aby czas jego uruchomienia był minimalny. Bardzo mały podstawowy zestaw pakietów jest uruchamiany domyślnie (lista znajduje się w pliku config/config.ini), a jeden z nich nazywa się p2 "konfiguratorem simplecon". Simpleconfigurator szuka pakietów, które mają nagłówek Bundle-ActivationPolicy:lazy i uruchamia je z flagą START_ACTIVATION_POLICY ... dlatego te pakiety będą "leniwie" uruchamiane, jak opisano powyżej.

Ważną rzeczą jest to, że wszystkie inne pakiety, które nie zawierają nagłówek nie zostanie uruchomiony na wszystkich pod Eclipse. Pozostaną one w stanie ROZWIĄZYWANYM, ich aktywatory nie będą wywoływane, a jeśli zawierają składnik deklaratywny, nie zostaną załadowane. Dzieje się tak dlatego, że usługi deklaracyjne oglądają tylko pakiety, które są w stanie AKTYWNYM lub STARTOWYM.

Dlatego głównym powodem użycia nagłówka jest zapisanie pakietu zawierającego komponenty usług deklaratywnych, które muszą działać w środowisku Eclipse.

W innych środowiskach jest , nie trzeba używać nagłówka. Większość normalnych aplikacji OSGi po prostu uruchamia wszystkie pakiety, zamiast próbować selektywnie uruchamiać podzestaw pakietów. Zauważ, że nie oznacza to, że aplikacje OSGi nie martwią się leniwym ładowaniem! Usługi deklarowania już teraz obsługują leniwe ładowanie bez zakłócania wyzwalaczy ładowania klas. Moim zdaniem Eclipse robi to źle i dodaje niepotrzebne złożoności do cyklu życia pakietu. Niemniej jednak, jeśli korzystasz z Eclipse, nie masz wyboru i musisz zrozumieć jego ograniczenia.

+0

Dobra odpowiedź. Nadal mam kilka pytań. 1) Kiedy ustawiam plugin w konfiguracji produktu na autoStart: true, to będzie on uruchamiany niezależnie od nagłówka Bundle-ActivationPolicy? 2) Co tak właściwie oznacza początkowy start? Mówisz: "w ogóle się nie zaczną". Jak wtyczka może działać, gdy nie jest uruchomiona? – Behnil

+1

1) Tak. 2) Uruchomiony oznacza, że ​​aktywator pakietu jest wywoływany, a komponenty DS są tworzone/zarządzane. Nie uruchomiony pakiet (np. RESOLVED) może nadal zapewniać zależności, np. eksportuj pakiety, które mogą być ładowane przez inne pakiety. Jest to przydatne w przypadku bibliotek pasywnych. –

+0

Przy okazji, DS, o którym mówisz. Są to wszystkie punkty rozszerzenia, takie jak wkład menu, wkład do części warsztatowej itp.?Ponieważ kiedy tworzę wtyczkę, która dodaje widok do perspektywy i nie ustawi jej jako Paczkę-Aktywacji: leniwy, widok jest nadal widoczny !? – Behnil