Platforma Eclipse se mezi verzemi 3.0 a 3.1 změnila nekompatibilním způsobem, který ovlivňuje moduly plug-in. Následující položky popisují oblasti, které se změnily, a poskytují pokyny pro migraci modulů plug-in pro verzi 3.0 do verze 3.1. Pokud máte problémy se spouštěním svých modulů plug-in pro verzi 3.0 ve verzi 3.1, vezměte na vědomí, že se stačí podívat pouze sem.
Co je ovlivněno: Moduly plug-in, které inicializují své výchozí hodnoty předvoleb plug-in potlačením Plugin#initializeDefaultPreferences
, nebo používají listenery změn předvoleb.
Popis: V Eclipse 3.1 byl objekt org.eclipse.jface.preference.IPreferenceStore
získaný z org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore
převeden migrací tak, aby fungoval nad novým rámcem předvoleb Eclipse 3.0 dodávaným modulem plug-in org.eclipse.core.runtime
.
Nezbytná akce: V důsledku toho by klienti používající rozhraní API předvoleb měli zkontrolovat dvě možné věci:
String
, nebo typový objekt. Dobrý klient by měl tedy zajistit, aby listenery změn předvoleb uměly ošetřit všechny tyto tři možné situace.
org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences
, musíte určitě zahrnout modul plug-in org.eclipse.core.runtime.compatibility
do svého seznamu modulů plug-in požadovaných vaším modulem plug-in a tuto závislost odstranit z modulu plug-in org.eclipse.ui.workbench
.Další podrobnosti viz dokumentace paměť předvolby.
Co je ovlivněno: Moduly plug-in, které vytváří či ukládají objekty IPath, nebo s těmito objekty manipulují.
Popis: Na platformě Eclipse 3.0 existovala u objektů IPath řada omezení pro segmenty cest, která byla přísnější než omezení vlastního operačního systému. Patřilo sem:
Tato omezení byla na platformě Eclipse 3.1 odstraněna v případech, kdy umístění dat platformy (pracovní prostor) je na systému souborů, který tato omezení nemá.
Nezbytná akce: Chcete-li zajistit řádné zpracování vylepšeného rozsahu cest, všechny případy použití objektů Path a IPath v rámci modulů plug-in je nutno přezkoumat a aktualizovat níže popsaným způsobem. V případě všech cest považovaných ve verzi 3.0 za legální se většina modulů plug-in i bez modifikace bude i nadále chovat přesně stejně jako ve verzi 3.0. Pokud se však tyto předepsané změny neprovedou, dojde k selhání v případech, kdy budou ve verzi 3.1 použity platné cesty, které byly ještě ve verzi 3.0 považovány za nepovolené.
Moduly plug-in ukládající řetězcová vyjádření ve formátu, jenž musí být čitelný na různých platformách, je třeba převést migrací na novou metodu továrny Path.fromPortableString. Tato metoda produkuje instanci objektu IPath z formátu nezávislého na platformě. Toto řetězcové vyjádření cest lze vytvořit pomocí metody IPath.toPortableString. Mezi soubory metadat, které jsou tímto ovlivněny, patří například soubory uložené v rámci projektů pracovního prostoru Eclipse (.project, .classpath, atd.), stejně tak jako všechny cesty uložené v paměti předvolby (org.eclipse.core.runtime.preferences.IPreferencesService).
Poznámka: fromPortableString správně přečte všechny řetězce cest vytvořené pomocí metody IPath.toString platformy Eclipse 3.0, nikoli však metodou toString platformy Eclipse 3.1. Ve většině případů proto není nutné u stávajících formátů souborů metadat cokoli měnit, pouze začít psát cesty pomocí toPortableString a číst je pomocí fromPortableString.
Bude potřeba převést migrací moduly plug-in, které dříve vytvářely cesty z pevně naprogramovaných řetězcových literálů předpokládajících speciální význam znaků ':' a '\' na všech platformách. Nejsnazším řešením je omezit literály řetězcových cest na podmnožinu podporovanou na všech platformách (vyvarovat se dvojtečky a zpětného lomítka). Literály cest mohou podporovat kompletní množinu platných cest systému Unix tak, že se použije přenosný formát řetězce cesty vrácený voláním Path.toPortableString. V tomto formátu se interpretuje první dvojtečka (':') jako oddělovač zařízení, lomítko ('/') jako oddělovač segmentů a dvojitá dvojtečka ("::") jako literálový znak dvojtečky. Například kódem new Path("c:/temp") se nyní na platformách Unix vytvoří relativní cesta se dvěma segmenty. Podobně se kódem new Path("a\\b") nyní vytvoří cesta s jedním segmentem na platformách Unix a dvěma segmenty na systémech Windows.
Bude potřeba aktualizovat příslušný kód modulů plug-in, které vytváří cesty pomocí metody IPath.append(String) předpokládající speciální význam znaků ':' a '\' na všech platformách. Na platformě Eclipse 3.1 tato metoda při interpretaci zadaného řetězce cesty používá oddělovače zařízení a segmentů specifické pro konkrétní operační systém. Například voláním append("a\\b") na platformách Unix se nyní připojí segment jediný, zatímco na systémech Windows se i nadále připojí dva segmenty.
Žádné datové soubory načítané a interpretované platformou již nadále nebudou považovat znaky ':' a '\' za speciální znaky na všech platformách. Všechny cesty ukládané v datových souborech, které lze číst na více platformách, musí být v přenositelném formátu. Například cesty souborů ikon a další cesty v souboru plugin.xml musí jako oddělovač segmentů cest používat pouze znak '/'.
Co je ovlivněno: Moduly plug-in pracující s objekty nebo uchovávající objekty IExtensionPoint
, IExtension
a IConfigurationElement
z modulu plug-in nebo registru rozšíření platformy Eclipse.
Popis: Před verzí 3.0 platilo, že všechny objekty získané z registru rozšíření (dříve Registru modulů plug-in) byly navždy dobré. Na platformě Eclipse 3.0 byly provedeny změny, které umožnily dynamické přidávání a odebírání modulů plug-in bez nutnosti Eclipse restartovat. Když je modul plug-in odebrán bez restartování, jeho položky v registru rozšíření se nutně stávají neplatnými. To znamená, že jiný modul plug-in pracující s objektem získaným dříve z položky registru rozšíření odstraněného modulu plug-in by byl ponechán s odkazem na neplatný objekt. Jedinou nápovědou, kterou by klient získal, by bylo naslouchání na IRegistryChangeEvent
.
Problém existoval od Eclipse verze 3.0, ale v praxi se s ním setkáme zřídka, protože je velmi neobvyklé odebrat modul plug-in bez restartování Eclipse.
Problém se ve verzi 3.1 řeší takto:
IExtensionPoint
, IExtension
,
a IConfigurationElement
nyní určují, že je-li objekt neplatný, způsobí to výjimku InvalidRegistryObjectException
. Výjimka je nekontrolovaná, aby ji klienti, kteří nejsou schopni dynamického chování, nebyli nuceni kontrolovat.
isValid()
, aby klient mohl určit, zda je objekt stále platný.
Nezbytná akce: Pokud je potřeba, aby byl váš modul plug-in schopen dynamického chování (tj. aby byl schopen zpracovat přidávání a odebírání modulů plug-in za pochodu), je třeba změnit kód pracující s objekty
IExtensionPoint
, IExtension
a IConfigurationElement
získanými z nějakého jiného modulu plug-in, aby byla zachycena výjimka IRegistryChangeEvent
úplně přesně, jako by to byla kontrolovaná výjimka. Zachycení výjimky (namísto předběžné kontroly voláním isValid()
) je jediným jistým způsobem, jak vyřešit odebrání modulu plug-in souběžným vláknem (pokud k němu dojde, téměř jistě bude).
Co je ovlivněno: Moduly plug-in, které programově přistupují k volbám formátovače kódu Java.
Popis: Jedinými možnými hodnotami pro volbu formátovače kódu org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_TAB_CHAR
na Eclipse 3.0 může být
TAB
nebo SPACE
. Ve specifikaci není výslovně zmíněno, že typ hodnoty představoval výčet, který by se mohl v budoucích verzích rozšiřovat. V Eclipse 3.1 byla přidána třetí možná hodnota MIXED
pro vyřešení chyby 73104.
Změnila se specifikace, aby byla zahrnuta tato nová hodnota a bylo možné přidávat další hodnoty i v budoucnu.
Nezbytná akce: Klienti, kteří programově čtou nebo nastavují tuto volbu formátovače kódu by měli zkontrolovat svůj kód, zda řeší tuto třetí hodnotu. Je třeba zkontrolovat, zda je kód klientů dostatečně robustní, aby nedošlo k jejich náhlému zhroucení v případě, že se narazí na hodnotu volby, která nebyla očekávána.
Co je ovlivněno: Moduly plug-in, které vytvářejí podtřídy nebo instance org.eclipse.ant.core.AntCorePreferences
Popis: V Eclipse verze 3.0 nebyla třída org.eclipse.ant.core.AntCorePreferences
řádně označena, takže klienti nemohou vytvářet její instance ani podtřídy.
Toto přehlédnutí bylo vyřešeno v Eclipse 3.1 a třída je zde označena tak, že není účelem, aby klienti vytvářeli její instance či podtřídy.
Nezbytná akce: Klienti programově vytvářející instanci třídy org.eclipse.ant.core.AntCorePreferences
by měli svůj kód migrovat pro načítání předvoleb za použití: org.eclipse.ant.core.AntCorePlugin.getPreferences()
.
Všechny podtřídy bude třeba předělat, aby již nevytvářely podtřídu třídy org.eclipse.ant.core.AntCorePreferences
.
Co je ovlivněno: Aplikace RCP potlačující protokol JFace nastavený modulem Workbench.
Popis: Modul Workbench na platformě Eclipse 3.0 nastavil protokol Workbench jako protokol sloužící k protokolování chyb JFace, a to předáním protokolu modulu plug-in modulu Workbench přímo do org.eclipse.jface.util.Policy.setLog(ILog)
. Ve verzi 3.1 byla z JFace odstraněna závislost na ILog
, aby se zpřístupnily samostatné aplikace používající SWT a JFace mimo běhovou komponentu Eclipse.
Pro potřeby JFace bylo zavedeno nové rozhraní ILogger
. Byl změněn modul Workbench se zabalením ILogger
nad ILog
modulu Workbench. Další informace viz chyba 88608.
Nezbytná akce: Většina aplikací RCP by neměla mít potřebu potlačovat protokol nastavený modulem Workbench, ale pokud předtím tyto aplikace volaly Policy.setLog(ILog)
, bude je potřeba upravit, aby namísto toho předávaly ILogger
.
Co je ovlivněno: Aplikace RCP očekávající výchozí perspektivu výhradně jinou než null.
Popis: Aby bylo možné mít aplikace RCP spuštěné s prázdným oknem bez otevřené perspektivy (rozšíření 71150), byla změněna volání
WorkbenchAdvisor.getInitialWindowPerspectiveId()
a IPerspectiveRegistry.getDefaultPerspective()
, která umožňují návratovou hodnotu null.
V integrovaném vývojovém prostředí je vždy výchozí perspektiva, tudíž IPerspectiveRegistry.getDefaultPerspective()
nevrátí hodnotu null.
Podobně platí, že pokud stávající aplikace RCP předtím vrátila voláním WorkbenchAdvisor.getInitialWindowPerspectiveId()
jinou hodnotu než null, volání
IPerspectiveRegistry.getDefaultPerspective()
také vrátí jinou hodnotu než null.
Nezbytná akce: Od klientů se nepožaduje žádná akce.
Co je ovlivněno: Moduly plug-in, které implementují org.eclipse.ui.IViewLayout.
Popis: V Eclipse verze 3.0 nebyla třída org.eclipse.ui.IViewLayout
řádně označena, takže ji klienti nemohou implementovat. Toto přehlédnutí bylo vyřešeno v Eclipse 3.1 a třída je zde označena tak, že není účelem, aby ji klienti implementovali.
Nezbytná akce: Všechny implementační třídy bude třeba přepracovat, aby neimplementovaly org.eclipse.ui.IViewLayout
.
Co je ovlivněno: Moduly plug-in, které implementují org.eclipse.jdt.launching.IVMInstall.
Popis: V Eclipse verze 3.0 nebyla třída org.eclipse.jdt.launching.IVMInstall
řádně označena, takže ji klienti nemohou přímo implementovat. Toto přehlédnutí bylo vyřešeno v Eclipse 3.1 a třída je zde označena tak, že není účelem, aby ji klienti přímo implementovali. Z důvodu zachování binární kompatibility stále umožňujeme klientům implementovat rozhraní přímo, ale důrazně doporučujeme, aby klienti namísto toho vytvořili podtřídu org.eclipse.jdt.launching.AbstractVMInstall
. Klienti, kteří implementují IVMInstall
by rovněž měli implementovat nové volitelné rozhraní org.eclipse.jdt.launching.IVMInstall2
, které nyní implementuje AbstractVMInstall
. Klientům se doporučuje implementovat nové rozhraní, IVMInstall2
, aby nedocházelo k problému zmiňovaném pod chybou 73493. Doporučeným způsobem migrace je vytvoření podtřídy AbstractVMInstall
.
Nezbytná akce: Každá z implementačních tříd, která již nemá podtřídu org.eclipse.jdt.launching.AbstractVMInstall
, by měla být přepracována tak, aby vytvořila podtřídu org.eclipse.jdt.launching.AbstractVMInstall.
Co je ovlivněno: Moduly plug-in, které používají org.eclipse.ui.SelectionEnabler.SelectionClass.
Popis: V Eclipse 3.0 byla vnořená implementační třída org.eclipse.ui.SelectionEnabler.SelectionClass
typu public, bez omezení použití.
Toto přehlédnutí bylo vyřešeno v Eclipse 3.1 a třída je zde zviditelněná pro balíčky.
Nezbytná akce: Všechny třídy vytvářející instance nebo rozšiřující org.eclipse.ui.SelectionEnabler.SelectionClass
bude třeba přepracovat, aby se na tuto třídu již neodkazovaly.
Co je ovlivněno: Moduly plug-in, které volají getParent()
na podtřídě
org.eclipse.jface.action.ContributionItem.
Popis: V Eclipse verze 3.0 metoda org.eclipse.jface.action.ContributionItem.getParent()
neuváděla, že může vracet hodnotu null. Toto přehlédnutí bylo vyřešeno v Eclipse 3.1 a dokumentace Javadoc pro tuto metodu již zde uvádí, takže může vracet hodnotu null. Další informace viz chyba 92777.
Nezbytná akce: Veškerý programový kód volající ContributionItem.getParent() musí umět ošetřit výsledek s hodnotou null.
Co je ovlivněno: Moduly plug-in, které implementují org.eclipse.ui.views.properties.IPropertySource
či IPropertySource2.
Popis: V Eclipse verze 3.0 byla specifikace pro metodu org.eclipse.ui.views.properties.IPropertySource.isPropertySet(boolean)
nesprávně změněna a uváděla, že se vrací hodnota "true" v případě, že zadaná vlastnost nemá smysluplnou výchozí hodnotu.
V předchozích verzích specifikace uváděla, že v takových případech se vrací "false".
Toto byla neúmyslná změna v API, přestože implementace fungovala jako předtím, kdy zdrojový text vlastnosti implementoval IPropertySource
a nikoli IPropertySource2
.
Tato chyba byla ve verzi 3.1 opravena a volání IPropertySource.isPropertySet(boolean)
funguje opět podle původní specifikace (tj. v tomto případě vrací "false") a IPropertySource2.isPropertySet(boolean) toto potlačuje se specifikací, že v tomto případě se má vracet "true".
Další informace viz chyba 21756.
Nezbytná akce: U tříd implementujících IPropertySource či IPropertySource2, kde některé z vlastností nemají smysluplné výchozí hodnoty by se mělo zkontrolovat, zda při volání isPropertySource(boolean) vrací příslušnou hodnotu. Klienti by měli zkontrolovat, zda tlačítko Obnovit výchozí hodnotu v pohledu Vlastnosti pro jejich zdrojový text vlastnosti funguje očekávaným způsobem.
Co je ovlivněno: Moduly plug-in, které používaly experimentální prvek
handlerSubmission
zavedený do bodu rozšíření
org.eclipse.ui.commands
platformy Eclipse 3.0.
Popis: Na platformě Eclipse 3.0 byl zaveden experimentální prvek do
bodu rozšíření org.eclipse.ui.commands
. Smyslem tohoto prvku byla registrace popisovačů prostřednictvím XML.
Od té doby však byl zaveden mnohem lepší mechanizmus, bod rozšíření
org.eclipse.ui.handlers
. Prvek byl původně označen jako experimentální, a proto byl nyní odebrán.
Nezbytná akce: Všechny moduly plug-in definující prvek
handlerSubmission
by měly migrovat na bod rozšíření
org.eclipse.ui.commands
.
Co je ovlivněno: Moduly plug-in, které nastavovaly pole GLOBAL_IGNORES_CHANGED v TeamUI.
Popis: V Eclipse 3.0 bylo pole GLOBAL_IGNORES_CHANGED přidáno do třídy TeamUI. Toto pole je konstantou používanou v události změny vlastnosti k označení toho, že se změnil seznam globálních ignorování uchovávaný týmovým modulem plug-in. Toto pole nebylo ve verzi 3.0 označeno jako "final", ale mělo tomu tak být. Ve verzi 3.1 je již označeno jako "final".
Nezbytná akce: Moduly plug-in, které výše uvedené pole nastavovaly, již tak činit nemohou.
Co je ovlivněno: Moduly plug-in, které nesprávně používají FillLayout.
Popis: Na platformě Eclipse 3.0 nebyly s FillLayout přidruženy žádné údaje o rozvržení a pokud aplikace přiřadila údaje o rozvržení podřízenému prvku řízenému přes FillLayout, bylo to ignorováno. Na platformě 3.1 byla přidána podpora pro FillLayout pro ukládání informací o velikosti do mezipaměti, aby se zlepšil výkon u operací změny velikosti. Data mezipaměti se ukládají v objektu FillData přidruženém s každým podřízeným prvkem řízeným přes FillLayout. Pokud aplikace nesprávně přiřadí údaje o rozvržení podřízenému prvku, v okamžiku volání computeSize na nadřazeném prvku se vyvolá výjimka ClassCastException.
Nezbytná akce: Najděte případné podřízené prvky ve FillLayout, u nichž jsou přiřazeny údaje o rozvržení a tyto údaje o rozvržení již nadále nepřiřazujte.
Co je ovlivněno: Moduly plug-in zachytávající výjimky při vytváření prvků widget.
Popis: Pokud byl na platformě Eclipse 3.0 vytvořen prvek widget se zlikvidovaným nadřazeným prvkem, nedošlo k vyvolání žádné výjimky a kód prvku widget později selhal, nebo byla vyvolána výjimka SWTException s textem "Prvek Widget je zlikvidován". Pokud je na platformě Eclipse 3.1 vytvořen prvek widget se zlikvidovaným nadřazeným prvkem, konstruktor vyvolá výjimku IllegalArgumentException s textem "Neplatný argument".
Nezbytná akce:Programový kód ošetřující výjimku SWTException při vytváření prvku widget bude muset ošetřit i výjimku IllegalArgumentException.