Insticksprogram och samlingspaket

Mekanismerna för att hantera insticksprogram implementeras med hjälp av OSGi-ramverket. Med den utgångspunkten är insticksprogram samma sak som en OSGi-samling. Samlingen och dess associerade klasser anger och implementerar processen för inläsning av Java-klasser, hantering som krävs och samlingens livscykel. I fortsättningen kommer vi att använda termerna insticksprogram och samling synonymt, om vi inte diskuterar en viss klass i ramverket.

Insticksprogram

Klassen Insticksprogram representerar ett insticksprogram som körs på plattformen. Det är en praktisk plats att centralisera insticksprogrammens livscykelaspekt och övergripande semantik. Ett insticksprogram kan implementera specialiserade funktioner för aspekterna start och stop av sin livscykel. Varje livscykelmetod innehåller en referens till en BundleContext som kan tillhandahålla ytterligare information.

Delen start av en livscykel förtjänar en särskild diskussion. Vi har redan sett att det går att hämta information om ett insticksprogram från insticksprogrammets manifestfil utan att köra någon kod för insticksprogrammet. Vanligtvis gäller att någon användaråtgärd i arbetsmiljön orsakar en händelsekedja som kräver att ett insticksprogram startas. Från ett implementeringsperspektiv startas aldrig ett insticksprogram förrän en klass som ingår i insticksprogrammet behöver läsas in.

Metoden start har varit ett praktiskt sätt att implementera initialiserings- och registreringsbeteende hos ett insticksprogram. Det är dock viktigt att inse att insticksprogrammet kan startas i många olika situationer. Något så enkelt som att du hämtar en ikon för att dekorera ett objekt kan orsaka att insticksprogrammets klasser läses in, vilket gör att insticksprogrammet startas. Om du är alltför ivrig att initialisera kan insticksprogrammets kod och data läsas in långt innan det är nödvändigt. Därför är det viktigt att titta noga på insticksprogrammets initialiseringsuppgifter och fundera på om det finns några alternativ till att utföra initialisering vid start.

Samlingskontext

I livscykelhanteringen möts terminologin för "samlingar" och plattformens "insticksprogram". När insticksprogrammet startas får det en referens till en BundleContext där information som är relaterad till insticksprogrammet kan hämtas. Det går också att använda BundleContext till att ta reda på vilka övriga samlingar och insticksprogram som finns i systemet.

BundleContext.getBundles() kan användas till att hämta vektorer av alla samlingar i systemet. Du kan registrera lyssningsfunktioner för BundleEvent så att insticksprogrammet känner av när någon annan samling har en ändring i sin livscykelstatus. Mer information finns i javadoc för BundleContext och BundleEvent.

Före version 3.0 tillhandahölls ett insticksprogramsregister (IPluginRegistry) med liknande information. Det gick till exempel att ställa frågor till den om beskrivningsfunktioner för alla insticksprogram i systemet. Det här registret rekommenderas inte längre, utan i stället bör BundleContext användas för det här ändamålet. Plattformsregistret används nu uteslutande för information om utökningar och utökningspunkter.

Aktiveringsfunktion för samlingar

Gränssnittet BundleActivator definierar start- och stoppbeteendet som har implementerats i klassen Plugin. Även om klassen Plugin är praktisk för att implementera den här funktionen har den som utvecklar insticksprogram valfriheten att implementera gränssnittet för BundleActivator i vilken klass som helst som är lämplig för insticksprogrammets design. I själva verket behöver inte insticksprogrammet implementera det här gränssnittet alls om det inte krävs för specifik livscykelhantering.

Samlingar

Under varje insticksprogram ligger en OSGi-samling som hanteras av ramverket. Bundle är OSGi-enheten för modularitet. I grund och botten är en samling bara en filsamling (resurser och koder) som har installerats på plattformen. Varje samling har sin egen Java-klassinläsningsfunktion och innehåller protokoll för att starta, stoppa och avinstallera sig själv. Från Eclipse-plattformsperspektivet är Bundle bara en implementeringsklass. Den som utvecklar insticksprogram utökar inte klassen bundle utan använder Plugin eller andra BundleActivator-implementeringar som representerar insticksprogrammet.