Pat?McCarthy是IBM資深軟件工程師,他在一年前就寫了這篇文章,如果您想開發(fā)插件共享給其他人,那么學(xué)習(xí)如何有效地使用功能部件是最基本的。本文就如何組織功能部件和優(yōu)化使用插件開發(fā)環(huán)境來開發(fā)功能部件和插件提出了一些建議,同時介紹了定制?Eclipse?行為的高級技術(shù)。即便您只是想學(xué)習(xí)如何設(shè)置?Eclipse,以使您可以自定義任何工作空間的初始化屬性值,或者是學(xué)習(xí)如何使用鏈接文件來管理您添加到?Eclipse?的組件,本文對您來說也將有所幫助。?
構(gòu)建一個插件是很有趣的:您開始編寫代碼并創(chuàng)建您想要的工具。把插件拷貝到?Eclipse?或一個基于?Eclipse?的產(chǎn)品中的?\plupgins?目錄下,這個插件在?Eclipse?運(yùn)行期環(huán)境中就可以使用了。當(dāng)再一次使用?Eclipse?的時候,插件將被找到,而且經(jīng)過平臺的啟動處理,它在運(yùn)行期配置中將是可用的。?
但是誰知道或者關(guān)心您的插件加入了進(jìn)來?用戶可以明白您提供的是什么工具嗎?他們可以通過?Eclipse?來禁用、修補(bǔ)或者管理您的組件嗎?答案顯然是否定的。插件本身僅僅是一個插件,而不是與?Eclipse?平臺完全集成的組件。?
功能部件包裝插件?
如果沒有功能部件,插件是難以駕馭的,通俗地說,不屬于功能部件的插件是未被管理的插件。Eclipse?平臺的啟動過程包括一個配置的步驟。如果一個新的插件被拷貝到?\plugins?目錄,或者以其他方式使?Eclipse?在啟動的時候可以找到,配置過程會發(fā)現(xiàn)它,但只是通過將新插件的?splash?圖標(biāo)閃爍兩次來通知您。Eclipse?之所以會發(fā)現(xiàn)新的插件,是因?yàn)榇尜A在?\.metadate\.config\platform?中的當(dāng)前工作區(qū)的配置校驗(yàn)和發(fā)生了變化;由于您沒有向平臺提供一個可以引導(dǎo)用戶做出配置修改的功能部件,Eclipse?也只能是通過?splash-flash?來提示這一變化。將您的插件打包為一個(或兩個)功能部件,您將獲得如下好處:?
在?Eclipse?的配置過程中列出您的組件(在?feature.xml?文件中)所要求的先決條件?
使您的組件可以作為?Eclipse?配置的活動部分來管理?
創(chuàng)建標(biāo)記信息,讓使用那些使用運(yùn)行期環(huán)境的用戶可以識別您的組件,并通過一個歡迎頁面來告知用戶您的功能部件所提供的功能(在關(guān)聯(lián)到您的功能部件的?welcome.xml?文件中)?
用?Eclipse?更新管理器可以對您的組件進(jìn)行修改?
不要等到您的插件開發(fā)完成后再打包為功能部件。反映在功能部件定義中的設(shè)計結(jié)果會影響您如何構(gòu)建您的插件。例如,大多數(shù)的?Eclipse?組件都有?UI?功能部件和核心(不是?UI)功能部件。如果您的插件沒有按這種方法進(jìn)行劃分,您可能會馬上考慮重新設(shè)計它們。功能部件也可以用來自動編譯處理被引用的插件。?
主要功能部件標(biāo)識一個產(chǎn)品(但是您有控制權(quán))?
雖然功能部件很多,但是當(dāng)您啟動?Eclipse?的時候,只有一個功能部件處于控制之下。這個主要功能部件決定了產(chǎn)品的標(biāo)識和其他運(yùn)行期行為,包括確定名字和與運(yùn)行期平臺相關(guān)聯(lián)的圖示,以及對所有插件默認(rèn)屬性值的重新定義選項(xiàng)。在后面的定義您自己的全局屬性中可以看到,這個功能強(qiáng)大的選項(xiàng)使您可以定制您自己的?Eclipse?設(shè)置。?
功能部件構(gòu)建插件(如果您允許它們)?
插件開發(fā)環(huán)境(PDE)可以自動完成為完整的運(yùn)行期環(huán)境準(zhǔn)備功能部件和插件的大部分工作。參見?Eclipse.org?中文章的討論?"PDE?生成插件"(在后面的參考資料中有相關(guān)鏈接)。這些基本的步驟在The?Java?Developer´s?Guide?to?Eclipse(同樣參閱后面參考資料中的鏈接)中也曾作為一個練習(xí)涉及到,遵循那個練習(xí)您可以構(gòu)建并標(biāo)識您已有的插件。可以說如果您有一個功能部件,并且了解?PDE?如何幫助您構(gòu)建插件和功能部件,您就可以構(gòu)建一個功能部件,然后讓它去同時構(gòu)建所有相關(guān)的插件。構(gòu)建控制策略(bin.excludes?與?bin.includes)將在后面的使用?PDE?構(gòu)建功能部件的策略中討論。這些策略是對?Eclipse.org?文章以及The?Java?Developer´s?Guide?to?Eclipse一書的補(bǔ)充。?
平臺配置管理?
理解功能部件所需要條件有助于理解它們?nèi)绾螌顒优渲弥锌捎玫膬?nèi)容進(jìn)行管理。?
啟動過程?
如果是一個剛解壓縮的?Eclipse?平臺,那么當(dāng)您啟動?eclipse.exe?的時候?qū)l(fā)生:?
安裝可能已經(jīng)完成?
如果一個工作區(qū)已經(jīng)存在,那么會有一個?.metadata\.config\platform.cfg?配置文件。?
如果您是以常規(guī)方式安裝?Eclipse,您得運(yùn)行?eclipse?-initialize?命令來生成一個默認(rèn)的初始化配置文件,放置在?eclipse\.config?目錄下。這樣當(dāng)?Eclipse?以新的工作區(qū)啟動時不再出現(xiàn)?Completing?the?install?的圖示。?
找到?Java?運(yùn)行期環(huán)境(JRE)。默認(rèn)情況下,Eclipse?首先查找?exlipse\jre?子目錄。如果沒有找到,Eclipse?將查找在系統(tǒng)中注冊的?Java?運(yùn)行期環(huán)境。?
注意:-vm?dir-location?參數(shù)可以用到指定其他的?JRE。?
配置被作為新的工作區(qū)的一部分創(chuàng)建出來。新的工作區(qū)通常沒有任何的配置,所以您會在真正的?splash?圖標(biāo)之前看到一個圖標(biāo),通知您安裝設(shè)置完成。?
處理那些注冊到?Eclipse?的功能部件和插件,并創(chuàng)建在后面將會用于檢測變化的校驗(yàn)和。這些功能部件和插件或者位于當(dāng)前的?eclipse\features?目錄和?eclipse\plugins?目錄下,或者位于由鏈接文件指定的?eclipse\...?目錄結(jié)構(gòu)中。?
一旦?Eclipse?啟動,活動配置定義將包含在?.metadata\.config\platform.cfg?文件中。?
鏈接文件如何擴(kuò)展一個?Eclipse?安裝設(shè)置?
如果您已經(jīng)使用了一段時間的?Eclipse?或者在您的配置中添加了哪怕只是一個新的插件,您肯定知道?Eclipse?是到?eclipse\features?目錄和?eclipse\plugins?目錄下去查找功能部件和插件的。不過您是否知道,Eclipse?也會到文件系統(tǒng)的其他位置去查找功能部件和插件?如果在?eclipse\links?目錄下存在格式正確的鏈接文件,那么這些文件會被處理,相關(guān)聯(lián)的功能部件和插件(包括沒有相關(guān)功能部件的插件)在運(yùn)行期配置中都會是可用的。?
一個鏈接文件只是一個命名為?id.link?的任意文件,在這里?id?通常是正在被引用的根功能部件的?id。您可以在鏈接文件目標(biāo)中定義不只一個功能部件,并且名字命名為?foo.link?彩強(qiáng)梢越郵艿摹8鲆桓靄縵履諶蕕牧唇游募?
path=E:/Eclipse-2.1.1/installedFeatures/Examples?
Eclipse?將會到指定的目錄下去查找?eclipse\features?目錄和?eclipse\plugins?目錄,看是否有合法的功能部件和(或)插件。也就是說,目標(biāo)目錄必須包含一個?\eclipse?目錄。如果找到,附加的功能部件和插件在運(yùn)行期配置是將是可用的,如果鏈接文件是在工作區(qū)創(chuàng)建之后添加的,附加的功能部件和插件會作為新的配置變更來處理。?
使用鏈接文件來定制您自己的?Eclipse?安裝設(shè)置的策略將在本文稍后的使用鏈接文件管理?Eclipse?安裝設(shè)置中進(jìn)行討論。?
配置更新?D?D添加一個功能部件?
如果一個新的功能部件及所用到的插件已經(jīng)添加到已有的?\features?目錄和?\plugins?目錄下,或者通過一個鏈接文件注冊到?Eclipse,校驗(yàn)和的變化將觸發(fā)配置處理過程。這個處理在一個簡單的?splash-flash?之后進(jìn)行。新的功能部件作為一個配置變更來處理,并且顯示出一個配置變更的對話框。?
例如,如果您打開一個標(biāo)準(zhǔn)的?Eclipse?解壓縮環(huán)境的工作區(qū),而后找到了?Eclipse?Examples,您把它解壓縮到與?Eclipse?同樣的目錄樹中或者添加了一個鏈接文件來指明這個例子解壓縮到了何處,將會出現(xiàn)一個如圖1所示的對話框。?
所以,如果您看到類似于這樣的一個對話框,那是因?yàn)樵谀\(yùn)行一個安裝配置程序的時,您自己或者其他人修改了?Eclipse?的配置,而平臺發(fā)現(xiàn)了新的或者更新過的可用功能部件。如果條目可以被選中,您可以將這個變化添加到您當(dāng)前的配置中。如果條目被禁用,說明存在配置上的問題,這個功能部件不能被添加進(jìn)來。按下?Error?Details?按鈕可以查看有關(guān)配置問題的信息。?
配置管理注解:?
存在未決變更并不意味著您不得不馬上接受它們,在相當(dāng)一段時間內(nèi)您完全可以不去理會它們,只需要取消對條目的選擇,并點(diǎn)擊?Finish即可。要在以后再添加它們,您可以選擇 Help?>?Software?Updates?>?Pending?Changes... 來再次打開那個對話框。?
已經(jīng)被接受的變更在以后還可以禁用。打開?Install/Update?透視圖,在?Install?Configuration?視圖中選中功能部件,然后在?Preview?視圖中選擇?Disable?。禁用的功能部件還可以通過類似的步驟啟用。在?Install?Configuration?視圖中點(diǎn)擊?Show?Disabled?Features?圖標(biāo)可以顯示被禁用的功能部件。?
功能部件在運(yùn)行期標(biāo)識組件?
Eclipse?允許標(biāo)識活動產(chǎn)品,也可以選擇標(biāo)識運(yùn)行期配置中的每一個功能部件。功能部件不是必須要標(biāo)識出來,您可以不標(biāo)識您所有的功能部件,但是您應(yīng)該至少標(biāo)識一個。?
標(biāo)識定義?D?D插件的工作?
添加標(biāo)識的關(guān)鍵問題是要明白把標(biāo)識的定義在哪里。您定義標(biāo)識的是功能部件,但是標(biāo)識的內(nèi)容是來自于插件。或者插件與功能部件的?id?相同(默認(rèn)的情形),或者插件在功能部件的定義中被明確標(biāo)識(這是?Eclipse?2.1.1?的新增功能)。在?Eclipse?2.1?中,一個功能部件定義可以通過在?feature.xml?文件中指定屬性?plugin=…?來定義其他插件。?
插件包含了用于定義和提供標(biāo)識內(nèi)容的文件。?
標(biāo)識內(nèi)容概要介紹?
about.ini?控制文件定義了產(chǎn)品級和功能部件級的標(biāo)識。產(chǎn)品標(biāo)識必須正確包含以下兩方面內(nèi)容:?
功能部件必須被定義為一個可能的主要功能部件,即在?feature.xml?定義文件中要包含?primary="true"。?
功能部件必須被標(biāo)識為活動的主要功能部件,在產(chǎn)品中通常是在?\eclipse?目錄下的?install.ini?文件中的條目來設(shè)置。主要功能部件也可以在運(yùn)行期通過使用?-feature?featureId?啟動參數(shù)來定義。?
理解功能部件標(biāo)識的最簡單的辦法是去查看在?about.ini?控制文件中定義了哪些元素,以及它們在一個被標(biāo)識的產(chǎn)品或功能部件中如何起作用。?
以下幾條僅用于產(chǎn)品標(biāo)識:?
windowImage?
appName?
aboutImage?
其余條目在產(chǎn)品及功能部件標(biāo)識過程中使用。?
以百分號(%)開頭的值在?about.properties?文件中解析。當(dāng)一個功能部件是主要功能部件時,用?abouText?關(guān)鍵字定義的文本會在?About?product?對話框中顯示。當(dāng)用戶點(diǎn)擊?Feature?Details?按鈕時,隨后彈出的?About?Features?對話框中也會顯示這些本文內(nèi)容。?
功能部件被加入到運(yùn)行期配置時,會打開?welcomePage?條目指定的歡迎頁面,其后還可以通過選擇?Eclipse?菜單選項(xiàng)?Help?>?Welcome...?打開的?Welcome?選擇對話框打開這個歡迎頁面。?
構(gòu)建一個可行的有標(biāo)識的功能部件的最快速方法是克隆一個在?Eclipse?本身中可以找到的一個現(xiàn)有的功能部件。具有?org.eclipse.platform?id?的功能部件和插件會提供功能部件標(biāo)識和插件標(biāo)識。在The?Java?Developer´s?Guide?to?Eclipse一書第34章練習(xí)7中有一個步驟詳盡的指導(dǎo)說明。?
在?Eclipse.org?的更新管理器子工程的開發(fā)資源中,您可以找到另外一些關(guān)于標(biāo)識的詳細(xì)說明(參見參考資料中的鏈接)。?
使用?PDE?構(gòu)建功能部件的策略?
在The?Java?Developer´s?Guide?to?Eclipse一書中關(guān)于功能部件開發(fā)的章節(jié)和?Eclipse.org?的文章?"PDE?生成插件"中都對構(gòu)建功能部件的過程進(jìn)行了介紹,但是也還有一些其他的途徑。當(dāng)您理解了如何使用?PDE?來構(gòu)建功能部件和相關(guān)聯(lián)的插件之后,您可以讓這些步驟自動完成。?
由?PDE?實(shí)現(xiàn)的?Ant?目標(biāo)?
讓我們從對?PDE?所提供功能概要介紹開始講起。PDE?將為一個?plugin.xml?或?feature.xml?文件生成?build.xml?文件。Build.xml是一個?Ant?腳本,可以完成運(yùn)行期平臺的功能部件和插件所需要的不同任務(wù)。PDE?構(gòu)建過程允許您生成下列構(gòu)建目標(biāo)中的一個或多個。?
重要的功能部件構(gòu)建目標(biāo):?
build.jars?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.jars?任務(wù)。?
build.update.jar?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.update.jars?任務(wù)。同時會為功能部件創(chuàng)建一個?Update?JAR。這是?Ant?腳本的默認(rèn)目標(biāo)。?
build.sources?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.source?任務(wù)。?
zip.distribution?創(chuàng)建一個包含功能部件和引用到的插件所需要的所有文件的壓縮文件。?
refresh?使?Eclipse?刷新功能部件工程及任何引用到的插件的工程。?
重要的插件構(gòu)建目標(biāo):?
build.jars?為插件定義的每一個運(yùn)行期?JAR?調(diào)用?build.xml?文件中的許多目標(biāo)。被調(diào)用的目標(biāo)的名字與運(yùn)行期?JAR?文件的名字相同。這些目標(biāo)編譯?Java?代碼并創(chuàng)建?JAR?文件,包含任何在源文件目錄下的資源。?
build.update.jar?將所有運(yùn)行期插件目錄下所有需要的文件壓縮打包為一個名字為?plugin.id_version.jar?的文件,在這里?plugin.id?和?version?來自于?plugin.xml?文件。這是?Ant?腳本的默認(rèn)目標(biāo)。?
build.sources?基于給定的運(yùn)行期?JAR?文件所定義的源文件目錄,創(chuàng)建?Java?源文件的壓縮包。?
zip.plugin?創(chuàng)建一個包含有插件所需要的所有內(nèi)容的壓縮包。?
refresh?使?Eclipse?刷新插件工程。?
注意:在功能部件和插件的Ant?處理過程中,更新?JAR?或生成壓縮包的處理過程中打包的文件,是運(yùn)行期環(huán)境所需要的那些文件。這些內(nèi)容在功能部件或插件的?build.properties?文件和在?plugin.xml?中定義的每一個插件的運(yùn)行期?JAR?文件中,通過?bin.includes?或者?bin.excludes?條目來描述。?
為了構(gòu)建一個插件,您可能會指定?clean,build.sources,build.jars,zip.plugin,refresh。為了構(gòu)建一個功能部件,您可能會指定clean,build.sources,build.jars,zip.distribution,refresh。您或許會想要在開始時使用?clean?來強(qiáng)制重新生成所有結(jié)果,經(jīng)常會有這種情況。盡管?Ant?處理過程將基于輸入的變化重新執(zhí)行所需要的步驟,但是有一些變化不會觸發(fā)所有需要的處理過程。測試結(jié)果表明如果您改變了一個?Java?源文件,相應(yīng)的源文件壓縮包將會更新,但是類不會被重新編譯,運(yùn)行期?JAR?也不會被更新。所以安全起見,建議您先將輸出結(jié)果清空,以保證您在重新構(gòu)建后所使用的是對應(yīng)于當(dāng)前源文件的運(yùn)行期版本。?
討論方案?
為了進(jìn)行討論,我們先描述一下只有一個功能部件和插件時在運(yùn)行期配置中需要的內(nèi)容。?
組件結(jié)構(gòu)示例?
組件類型?
文件?
功能部件?
feature.xml?
feature_image.jpg?
/license/license.html?
/license/license.pdf?
/plan/project-plan.doc?
插件?
plugin.xml?
/images/action.gif?
/images/editor.gif?
/src/co/pkg/id/action.java?
/src/co/pkg/id/editor.java?
/design-docs/plug-in.doc?
/design-docs/editor.doc?
正如您所看到的文件名,雖然這些文件大部分屬于運(yùn)行期環(huán)境,還是有一些文件不是您想要與其他人共享的(例如,您的設(shè)計文檔)。?
包含策略?D?D指出所需要的部分?
至少到剛開始時,最簡單的方法是,在構(gòu)建過程中將您要打包的部分作為在運(yùn)行期配置中功能部件或插件的一部分而列出來。相應(yīng)的?build.properties?文件分別如下所示:?
build.properties?內(nèi)容?
組件?
build.properties?文件內(nèi)容?
功能部件?
bin.includes?=?feature.xml,\?
license/?
插件?
source.runtime.jar?=?src/?
bin.includes?=?plugin.xml,\?
images/?
排斥策略?D?D指定不需要的或私有的部分?
另一種方法是把您不想打包的部分在構(gòu)建過程中作為功能部件或插件的一部分列出來。這不僅要包括您不想共享的文件,還要包括構(gòu)建過程中創(chuàng)建的文件和目錄(有一些是臨時的)。這種方法用到的?build.properties?文件如下:?
build.properties?內(nèi)容?
組件?
build.properties?文件內(nèi)容?
功能部件?
bin.excludes?=?temp.folder/,\?
com.ibm.master.lab.core_1.0.0.bin.dist.zip,\?
.classpath,\?
.project,\?
build.xml,\?
build.properties?
插件?
bin.excludes?=?temp.folder/,\?
bin/,\?
.classpath,\?
.project,\?
build.xml,\?
build.properties,\?
makesrczip.xml,\?
src/?
如果給定功能部件或插件的?id?值為?com.your.feature.id?或者?com.your.plugin.id,那么您在使用排斥策略的時候還需要在文件中包括以下條目:?
com.your.feature.id_1.0.0.bin.dist.zip,\?
com.your.feature.id_1.0.0.jar,\?
com.your.plugin.id_1.0.0.jar,\?
zip?條目將使生成的組件壓縮包不被?update?JAR?或者組件壓縮包自己所包含。JAR?條目將使生成的功能部件或插件的?update?JAR?不被組件壓縮包或者?update?JAR?自己所包含。?
當(dāng)您的組件壓縮包或者?update?JAR?看起來比它應(yīng)該的大小要大,或者在每次您進(jìn)行編譯時包的大小呈跳躍式增長,說明您應(yīng)該執(zhí)行以上步驟了。您需要在適當(dāng)?shù)墓δ懿考蛘卟寮?build.properties?文件中加入以上條目來解決這個問題。?
對文件或者結(jié)構(gòu)變化的響應(yīng)?
除了以上提到的之外,當(dāng)一個新的文件或目錄添加到功能部件或者插件時,還有必需的響應(yīng)需要考慮。我們的意思是您得讓您的功能部件和插件能應(yīng)付可能的改變,也就是說它們分別需要一個?feature.properties?文件和一個?plugin.properties?文件。當(dāng)您用包含策略時,您需要給?.properties?文件添加一個適當(dāng)?shù)膶傩裕绻鞘褂门懦獠呗缘脑捑筒挥眠@樣做了。?
不論哪種方法,如果您把一個文件添加到一個目錄,那么不需要做任何其他的改動。對于新添加的文件,如果使用的是包含策略,它會被發(fā)送處理,如果使用的是排斥策略,它將不會被發(fā)送處理。這實(shí)際上是您可能應(yīng)該要考慮使用不同的目錄來存放不同的文件的原因。例如,您的插件所用到的所有圖片所在的目錄應(yīng)該被包含在內(nèi),而一個開發(fā)過程中存放插件的設(shè)計討論或文檔的目錄則不然。?
最壞的情形是當(dāng)您忘記對?build.properties?進(jìn)行更新時:會發(fā)生運(yùn)行期失敗或生成內(nèi)容存在差錯的產(chǎn)品。如果您使用包含策略,新加入的文件或目錄在打包后是不可用的,這有可能會導(dǎo)致您的插件不能用或者顯示出?Eclipse?默認(rèn)的圖標(biāo)(紅盒子)。如果是使用排斥策略添加新文件或目錄,這些文件或目錄的內(nèi)容在打包過程中會被包含進(jìn)來。根據(jù)您的風(fēng)格選擇適當(dāng)?shù)姆椒ǎ瑥亩涯泩?zhí)行更新時的風(fēng)險降到最低。這將取決于您所面臨的主要問題:是功能部件或插件不能運(yùn)行,還是其他人本不應(yīng)該看到運(yùn)行期目錄下的文件。?
組織功能部件?
當(dāng)您在開發(fā)您的工具時,您是否考慮到了需要多少個插件?答案是至少三個:一個是您的模型,也就是非?UI?的核心部分,一個是您的?UI?內(nèi)容,還有一個或多個是用于提供幫助內(nèi)容。如果您注意過,您會發(fā)現(xiàn)這是?Eclipse?本身的基本模式(jdt.core,?jdt.ui,?jdt.doc;?debug.core,?debug.ui;等等)。?
這樣劃分的原因之一是,相對于不用于?UI?的插件來說,用于?UI?的插件在運(yùn)行期需要不同的?Eclipse?組件的支持(org.eclipse.ui)。?
包含其他功能部件?
功能部件如果沒有被其他功能部件包含,那么在?Eclipse?配置中都會被配置為根功能部件。默認(rèn)情況下,根功能部件可以由用戶在?Install/Update?透視圖中禁用或啟用,并且可以在?feature.xml?文件中確定一個更新?URL。當(dāng)包含一個功能部件時,只有在根功能部件中的更新?URL?會被處理,否則只能通過?search-location?定義特別許可才可以。?
通過包含功能部件,您可以管理包的組織結(jié)構(gòu)。您可能會有多個功能部件,但只有一個做過標(biāo)識,其余的或者是用來構(gòu)成結(jié)構(gòu),或者是用來管理組件。請記住是根功能部件來定義更新的站點(diǎn),盡管這個角色可以由功能部件委派給它所包含的功能部件,通過設(shè)置?search-location?屬性值為?selfboth。?
如果您正在構(gòu)建一個基于?Eclipse?的產(chǎn)品,您可能希望您的一個功能部件來包含?Eclipse?功能部件樹。對于標(biāo)識這個產(chǎn)品來說這并不需要,但是您可以指定另外的更新站點(diǎn)(Eclipse?自己用的是?
http://update.eclipse.org/updates),或者根本不指定更新站點(diǎn),禁用基于 ?Web?的更新。?
可選功能部件的角色?
當(dāng)將一個功能部件包含到另一個功能部件時,您可以選擇是否把它設(shè)置為可選的。主要原因是創(chuàng)建這樣的結(jié)構(gòu)可以讓用戶根據(jù)他自己的需要來禁用您提供的組件的一部分。?
當(dāng)新的功能部件包含有可選功能部件,但那些可選功能部件并不存在時,Eclipse?的配置邏輯不允許添加這個新的功能部件。也就是說,如果適當(dāng)?shù)南葲Q條件成立,可以使用可選功能部件來創(chuàng)建層結(jié)構(gòu)。不過需要將這些層存貯在不同的目錄樹下,并且每層使用單獨(dú)的鏈接文件。您可以添加到?Eclipse?配置以增加其功能的鏈接文件的沒有數(shù)目上的限制。?
讓?Eclipse?(或者任何基于?Eclipse?的產(chǎn)品)以您的方式工作?
現(xiàn)在向您講明了兩點(diǎn):指定的主要功能部件控制整個產(chǎn)品的標(biāo)識和默認(rèn)屬性,Eclipse?可以在安裝配置目錄下或者任何一個鏈接的?Eclipse?目錄結(jié)構(gòu)下找到組件。這意味著您可以改變?Eclipse?(存在相關(guān)風(fēng)險,不過僅僅意味著您修改時需要小心!)。這些改變可以幫助您管理基于?Eclipse?的安裝配置,并使之支持您個人所喜好的屬性規(guī)則。?
使用鏈接文件來管理?Eclipse?安裝配置?
您可能會希望能對環(huán)境進(jìn)行更多的管理,而不是毫無選擇地將所有的插件(我希望是引用到的功能部件)全部安裝到您的?Eclipse?目錄樹下。如果您需要更新?Eclipse,實(shí)際上您并不想要另外再裝一個新的?Eclipse?或者在列表中去查找您所想要的功能部件和插件。?
下面是一種借助鏈接文件來組織您的?Eclipse?或者基于?Eclipse?的產(chǎn)品和構(gòu)件的方法:?
保持?Eclipse?或者基于?Eclipse?的產(chǎn)品是干凈的。也就是說,不要把您的任何功能部件或者插件添加到?eclipse\features?和?eclipse\plugins?目錄下。?
在已有的?eclipse?目錄下創(chuàng)建一個?eclipse\links?目錄和一個?eclipse\links-out?目錄。如果您用的是基于?Eclipse?的產(chǎn)品,那么可能已經(jīng)存在?eclipse\links-out?目錄。這個目錄并不特殊,只是一個用來方便存放不用的鏈接文件的地方。?
為您要添加到您的配置中的功能部件和插件創(chuàng)建一個或多個?add-ons?的目錄。在這些目錄下,創(chuàng)建一個?eclipse\features?和一個?eclipse\plugins?目錄結(jié)構(gòu)。?
為每一個?add-ons?目錄在?eclipse\links-out?目錄下創(chuàng)建一個鏈接文件。將那些您當(dāng)前要添加到您的活動配置中去的鏈接文件拷貝到?eclipse\links?目錄。?
例如,假定您將?Eclipse?解壓縮到一個名為?Eclipse-2.1.1?的目錄下,然后創(chuàng)建一個名為?CoolTools?的?add-ons?目錄,也放在?Eclipse-2.1.1?目錄下。在?CoolTools?目錄下,您可以有多個目錄,每個目錄用于一個或一族您要添加到?Eclipse?的工具。您的目錄結(jié)構(gòu)可能會如圖3所示?
EditorList.link?文件要包含下面其中一條(不能是全部)?
path=D:/Eclipse-2.1.1/CoolTools/EditorList?
path=D:\\Eclipse-2.1.1\\CoolTools\\EditorList?
斜杠是一條(/)還是兩條(\\)取決于目錄結(jié)構(gòu)。?
確認(rèn)條目不要以空格結(jié)尾,因?yàn)檫@樣?Eclipse?會忽略它?D?D我第一次用鏈接文件時用了好幾個小時才弄明白這一點(diǎn)。?
如果您使用一個新的工作區(qū)來啟動?Eclipse,所有?Eclipse?自帶的以及通過鏈接文件找到的功能部件和插件都是可用的。如果您要添加一個鏈接文件,并使用現(xiàn)有的工作區(qū)重新啟動?Eclipse,Configuration?Changes?對話框就會彈出。如果您刪除了一個鏈接文件(很簡單,只是把它移到?\links-out?目錄下),配置的變化也會被?Eclipse?注意到,但您能看到的僅僅是?splash-flash。?
實(shí)際上您不是必須將鏈接文件移入移出來控制配置,更好的辦法是用?Install/Update?透視圖來調(diào)整配置。當(dāng)然,可以這樣做的前提是您的插件都屬于功能部件(看,這是另外一個需要功能部件的理由)。使用?Eclipse?進(jìn)行配置的調(diào)整將以后面討論。?
使用?Install/Update?透視圖來修改配置?
根功能部件,以及任何定義為可選擇的功能部件,都可以在當(dāng)前配置中禁用。被禁用后,功能部件仍然可以被平臺認(rèn)出;它們只是不再包含在當(dāng)前的運(yùn)行期配置中。?
前面我們談及了將?Eclipse?Examples?添加到活動配置中。添加后,我們可以使用?Install/Update?透視圖來禁用它。如果您正打開一個包含有?Eclipse?Examples?的?Eclipse?配置的?Install/Update?透視圖,您看到的將如圖4?所示?
在?Preview?視圖中點(diǎn)擊?Disable?Now?按鈕,您就可以將?Eclipse?Examples?功能部件從運(yùn)行期配置中臨時移除。點(diǎn)擊后,Eclipse?將提示您重新啟動平臺來使配置的修改生效。?
Eclipse?Examples?功能部件在當(dāng)前配置中將不再可見(或者說不是活動的)。為了能再次看到這個功能部件并啟用之,您需要在?Install?Configuration?視圖中點(diǎn)擊?Show?Disabled?Features?開關(guān)按鈕(見圖5)。?
由于?Eclipse?Examples?功能部件是一個根功能部件,所以可以這樣做。如果您在?Eclipse?SDK?中瀏覽其他功能部件,您將發(fā)現(xiàn)它們在?Preview?視圖中沒有相應(yīng)的?Disable?Now?按鈕,這是因?yàn)樗鼈儽欢x為必需的。?
如果您用的是?Eclipse?SDK,您應(yīng)該會有默認(rèn)配置的平臺、JDT?和?PDE。如果您正在做一些插件的開發(fā),但是您不需要?PDE??或者在一些情況下,您不是總需要?JDT??您只要對?Eclipse?做一個小的修改就可以禁用這些功能部件。打開?org.eclipse.platform.sdk.win32?功能部件的?feature.xml?文件,將以下幾行修改為包含?optional="true"?屬性。?
清單?1.?禁用?PDE?和?JDT?
<includes?id="org.eclipse.platform.win32"?version="2.1.1"?match="equivalent"/>?
<includes?id="org.eclipse.jdt"?version="2.1.1"?match="equivalent"?optional="true"/>?
<includes?id="org.eclipse.pde"?version="2.1.0"?match="equivalent"?optional="true"/>?
<includes?id="org.eclipse.platform.win32.source"?version="2.1.1"?match="equivalent"?
optional="true"/>?
<includes?id="org.eclipse.jdt.source"?version="2.1.1"?match="equivalent"?optional="true"/>?
現(xiàn)在您可以在?Install?Configuration?視圖中選擇這些功能部件并禁用它們。如果所有前面提到那些定義為可選擇的功能部件都被禁用,平臺依然可以運(yùn)行。并且,您隨時可以重新啟用它們。圖6?是?Install?Configuration?視圖中顯示的被禁用的功能部件。?
圖?6.?禁用?Eclipse?多個的功能部件?
這些禁用/啟用的設(shè)置都是僅對于當(dāng)前工作區(qū)有效。您可以有另外的活動工作區(qū),其中包含有部分或全部在當(dāng)前工作區(qū)中被禁用的功能部件。?
這個簡單的例子說明了使用功能部件的優(yōu)勢(它們可以被禁用)和使用鏈接文件來將所有可能的功能部件添加到您的配置的意義所在。在一個給定的工作區(qū)中將您所不需要的功能部件禁用,這樣就可以優(yōu)化當(dāng)前配置。?
定義自己的全局屬性?
Eclipse?是一個優(yōu)秀的工具,但是同任何工具一樣,您得對它進(jìn)行定制,它才能是完美的。工具提供了屬性頁面來讓您改變工具的行為或可視化顯示。最新統(tǒng)計,在?Eclipse?中有?62?個屬性頁面。幾乎每次您使用到一個新工具,您都會發(fā)現(xiàn)有些選項(xiàng)您想要修改。但是當(dāng)您使用多個工作空間時,或者是在一個團(tuán)隊的環(huán)境中工作,有一些選項(xiàng)需要與他人協(xié)調(diào),這樣就出現(xiàn)了如何在跨工作空間以及與他人協(xié)調(diào)工作時對選項(xiàng)進(jìn)行最佳管理的問題。?
Eclipse?提供了導(dǎo)入/導(dǎo)出屬性的功能。在任何一個屬性對話框中,您都可以將屬性導(dǎo)出到一個?.epf?文件中。當(dāng)使用其他工作區(qū)或與他人共享時,可以再次導(dǎo)入這個文件。您甚至可以將它添加到工程中與團(tuán)隊成員共享,以便每個人都可以得到標(biāo)準(zhǔn)的屬性。?
但是這樣做會變得單調(diào)而乏味,并且如果您忘記了就麻煩了。在使用?Eclipse?或任何基于?Eclipse?的產(chǎn)品時,您應(yīng)該意識到還有另外一種方法可以定義全局屬性。您可以通過修改主要功能部件的?plugin_customization.ini?文件來定制屬性的默認(rèn)值。?
您可以在?eclipse?目錄下的?install.ini?文件中找到主要功能部件。例如,在標(biāo)準(zhǔn)的?Eclipse?解壓縮中的?install.ini?的內(nèi)容如下:?
清單?2.?標(biāo)準(zhǔn)的?Eclipse?解壓縮中的?install.ini?的內(nèi)容?
#?install.ini?
#?java.io.Properties?file?(ISO?8859-1?with?"\"?escapes)?
#?This?file?does?not?need?to?be?translated.?
#?Required?property?"feature.default.id"?contains?the?id?of?the?primary?feature?
#?(the?primary?feature?controls?product?branding,?splash?screens,?and?plug-in?customization)?
feature.default.id=org.eclipse.platform?
#?Required?property?"feature.default.application"?contains?id?of?the?core?
#?application?that?gets?control?on?startup.?For?products?with?a?UI,?this?
#?is?always?org.eclipse.ui.workbench;?for?"headless"?products,?this?is?product-specific.?
feature.default.application=org.eclipse.ui.workbench?
feature.default.id=…?指定了默認(rèn)的主要功能部件。要注意的是,通過在啟動?Eclipse?時使用?-feature?選項(xiàng),可以把其他功能部件聲明為是主要的。?
同大部分功能部件控制和標(biāo)識一樣,實(shí)際的工作都是在功能部件相關(guān)聯(lián)的插件中完成的。對于?Eclipse來說,這是一個?id?與功能部件相同的插件,org.eclipse.platform?插件。如果您仔細(xì)查看這個作為主要功能部件標(biāo)識的插件,您將發(fā)現(xiàn)一個名為?plugin_customization.ini?的文件。這個文件的內(nèi)容與導(dǎo)出屬性的文件類似。當(dāng)?Eclipse?啟動時會讀取這個文件,并用來指定所有默認(rèn)的屬性值,而不是去使用插件本身定義的那些值。這就使得產(chǎn)品,或者說是您,可以改變插件的行為。默認(rèn)的?plugin_customization.ini?文件的內(nèi)容只有一條:?
清單?3.?默認(rèn)的?plugin_customization.ini?文件 ?
#?plugin_customization.ini?
#?sets?default?values?for?plug-in-specific?preferences?
#?keys?are?qualified?by?plug-in?id?
#?e.g.,?com.example.acmeplugin/myproperty=myvalue?
#?java.io.Properties?file?(ISO?8859-1?with?"\"?escapes)?
#?"%key"?are?externalized?strings?defined?in?plugin_customization.properties?
#?This?file?does?not?need?to?be?translated.?
#?Property?"org.eclipse.ui/defaultPerspectiveId"?controls?the?
#?perspective?that?the?workbench?opens?initially?
org.eclipse.ui/defaultPerspectiveId=org.eclipse.ui.resourcePerspective?
這一條目指定了打開新的工作區(qū)時以及當(dāng)您關(guān)掉所有的透視圖后關(guān)閉?Eclipse?時打開的透視圖。如果您使用的基于?Eclipse?的產(chǎn)品,這個條目可能有所不同。?
指定要包含的屬性的過程比較費(fèi)事,但至少您應(yīng)該做如下步驟:?
1.?啟動一個干凈的工作區(qū)。?
2.?修改您想要改變的一個屬性。?
3.?將屬性導(dǎo)出到一個?.epf?文件。?
4.?在導(dǎo)出的文件中找到新的健值,并確定它是否反映了您剛剛所做的改變。?
5.?將一個或多個鍵的條目拷貝到標(biāo)識插件(使用?Eclipse?時這個插件是?org.eclipse.platform)的?plugin_customization.ini?文件中。?
6.?測試結(jié)果,或者保留新的鍵,或者再試一次。?
注意:如果您不習(xí)慣于去更新產(chǎn)品的?plugin_customization.ini?文件,您可以在其他位置創(chuàng)建一個這個文件的拷貝,在啟動?Eclipse?或基于?Eclipse?的產(chǎn)品時使用參數(shù)來指定它。?
eclipse?-plugincustomization?myCustomDefaults.ini?
全局屬性示例?
前面提到了一些相關(guān)技術(shù)的描述,并提出了對您可能希望包含到您定制的?plugin_customization.ini?文件中的一些值的建議,這里給出了示例屬性重寫,作為對前面兩方面的內(nèi)容的說明。?
我們將把它們根據(jù)我定制的目的在邏輯上分為的幾部分來介紹。您可以下載完全的插件?customization.ini?文件。?
視圖欄默認(rèn)是在底部,但我喜歡把它們放在頂部:?
#?View?tabs?at?the?bottom?
org.eclipse.ui.workbench/VIEW_TAB_POSITION=128?
新工作區(qū)打開時不打開歡迎頁面,并且在關(guān)閉工作臺時不再提示:?
#?No?welcome?dialog?at?open?and?no?confirm?on?close?
org.eclipse.ui.workbench/WELCOME_DIALOG=false?
org.eclipse.ui.workbench/EXIT_PROMPT_ON_CLOSE_LAST_WINDOW=false?
在打開新工程向?qū)耐敢晥D時,禁用提示或其他動作:?
#?Never?change?to?perspective?required?by?new?project?wizard?(no?prompt)?
org.eclipse.ui.workbench/SWITCH_PERSPECTIVE_ON_PROJECT_CREATION=never?
定義另外的默認(rèn)文本字體:?
#?Default?text?font?(leaks?into?Java?editor)?
#?Note:?you?have?to?touch?the?font?page?and?say?OK/Apply?(probable?bug)?
org.eclipse.ui.workbench/org.eclipse.jface.textfont=?
1|Lucida?Console|9|1|WINDOWS|1|-15|0|0|0|700|0|0|0|0|3|2|1|49|Lucida?Console;?
注意:字體屬性條目比較特殊,對它的修改不會立即生效。如果您訪問字體屬性頁,前面所定義的內(nèi)容會顯示出來,不過得在您選擇了?OK?或者?Apply?之后才會生效。我不能讓這個鍵保存下來用于?Java?文本字體。?
預(yù)定義附加的?Java?編輯器任務(wù)標(biāo)簽:?
#?Add?to?the?default?JDT?task?tags?(TODO?should?probably?be?left)?
org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.taskTags=TODO,Edu-Sol?
將對?Package?Explorer?的雙擊默認(rèn)設(shè)置為?Go?Into?動作:?
#?Package?Explorer?GoInto?on?Double?click?
org.eclipse.jdt.ui/packageview.doubleclick=packageview.gointo?
有一些沒有定義屬性頁面的選項(xiàng)也是可以定制的。在完成對?UI?的標(biāo)準(zhǔn)設(shè)置后導(dǎo)出的?.epf?文件中,我發(fā)現(xiàn)有一些?JDT?的選項(xiàng)值是作為屬性來保存的。?
這個屬性鍵是用于告知?JDT?UI?它要讀取屬性并用來改變默認(rèn)的?UI?行為:?
#?Tells?JDT?it?does?have?some?prefs?to?use?(forces?a?read?of?these?values)?
org.eclipse.jdt.ui/CustomFiltersActionGroup.org.eclipse.jdt.ui.PackageExplorer.?
TAG_DUMMY_TO_TEST_EXISTENCE=storedViewPreferences?
注意:如果沒有上面的這個屬性鍵,接下來的兩組設(shè)置將被忽略。?
活動?Package?Explorer?過濾器以屬性值的形式保存:?
#?Package?Explorer?filter?-?standard?JDT?defaults?+?library?filter?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer.LibraryFilter=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer_patternFilterId_.*=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer.PackageDeclarationFilter=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer_patternFilterId_**.class=true?
org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.PackageExplorer.EmptyInnerPackageFilter=true?
Outline?視圖有一個顯示選項(xiàng),可以在活動的?JDT?Java?編輯器中顯示內(nèi)容時減小樹的深度。這個圖標(biāo)有一個懸浮幫助?Go?Into?Top?Level?Type,由下面這個屬性項(xiàng)來控制:?
#?Outline?view?GoInto?Toggle?when?using?JDT?editor?
org.eclipse.jdt.ui/GoIntoTopLevelTypeAction.isChecked=true?
您可能會想要嘗試為更多的屬性指定新的默認(rèn)值,使用前面描述的方法然后核對一下結(jié)果即可。您或許會希望在一個臨時的工作區(qū)中做這些事情,達(dá)到修改的目的后,您可以按此去修改活動的主要功能部件的?plugin_customization.ini?文件(不要告訴任何人是我教您這樣做的!)。并且要注意的是,您可能會發(fā)現(xiàn)其他一些鍵被忽略了,這種情況我也曾遇到過,因?yàn)樽煮w是用于?JDT?的,因此這一條目加入到?plugin_customization.ini?文件后,在屬性頁中根本就不會體現(xiàn)出這種變化。?
結(jié)束語?
功能部件是?Eclipse?的幕后英雄--它們很重要,因?yàn)樗鼈兪?Eclipse?配置管理的組成部分,支持產(chǎn)品標(biāo)識,并且它們是在?Eclipse?平臺上構(gòu)建定制解決方案的產(chǎn)品的一部分。使用功能部件您可以:?
當(dāng)您使用基于?Eclipse?的產(chǎn)品進(jìn)行工作時,您可以根據(jù)功能部件標(biāo)識鑒別出是誰提供了哪些不同的可用功能?
對產(chǎn)品的標(biāo)識可以幫助進(jìn)一步定制?Eclipse?
在插件開發(fā)環(huán)境中自動完成任務(wù)?
通過禁用/啟用根功能部件,或者使用?Install/Update?透視圖來禁用/啟用定義為可選的被包含的功能部件,您可以動態(tài)地改變給定工作區(qū)的配置?
所以,使用功能部件吧,它可以幫助您自動完成構(gòu)建插件的一些步驟,使用文中提到的自定義?install/link?文件組織方法,可以使您的?Eclipse?環(huán)境更加好用。
Pat?McCarthy?
IBM資深軟件工程師?
構(gòu)建一個插件是很有趣的:您開始編寫代碼并創(chuàng)建您想要的工具。把插件拷貝到?Eclipse?或一個基于?Eclipse?的產(chǎn)品中的?\plupgins?目錄下,這個插件在?Eclipse?運(yùn)行期環(huán)境中就可以使用了。當(dāng)再一次使用?Eclipse?的時候,插件將被找到,而且經(jīng)過平臺的啟動處理,它在運(yùn)行期配置中將是可用的。?
但是誰知道或者關(guān)心您的插件加入了進(jìn)來?用戶可以明白您提供的是什么工具嗎?他們可以通過?Eclipse?來禁用、修補(bǔ)或者管理您的組件嗎?答案顯然是否定的。插件本身僅僅是一個插件,而不是與?Eclipse?平臺完全集成的組件。?
功能部件包裝插件?
如果沒有功能部件,插件是難以駕馭的,通俗地說,不屬于功能部件的插件是未被管理的插件。Eclipse?平臺的啟動過程包括一個配置的步驟。如果一個新的插件被拷貝到?\plugins?目錄,或者以其他方式使?Eclipse?在啟動的時候可以找到,配置過程會發(fā)現(xiàn)它,但只是通過將新插件的?splash?圖標(biāo)閃爍兩次來通知您。Eclipse?之所以會發(fā)現(xiàn)新的插件,是因?yàn)榇尜A在?\.metadate\.config\platform?中的當(dāng)前工作區(qū)的配置校驗(yàn)和發(fā)生了變化;由于您沒有向平臺提供一個可以引導(dǎo)用戶做出配置修改的功能部件,Eclipse?也只能是通過?splash-flash?來提示這一變化。將您的插件打包為一個(或兩個)功能部件,您將獲得如下好處:?
在?Eclipse?的配置過程中列出您的組件(在?feature.xml?文件中)所要求的先決條件?
使您的組件可以作為?Eclipse?配置的活動部分來管理?
創(chuàng)建標(biāo)記信息,讓使用那些使用運(yùn)行期環(huán)境的用戶可以識別您的組件,并通過一個歡迎頁面來告知用戶您的功能部件所提供的功能(在關(guān)聯(lián)到您的功能部件的?welcome.xml?文件中)?
用?Eclipse?更新管理器可以對您的組件進(jìn)行修改?
不要等到您的插件開發(fā)完成后再打包為功能部件。反映在功能部件定義中的設(shè)計結(jié)果會影響您如何構(gòu)建您的插件。例如,大多數(shù)的?Eclipse?組件都有?UI?功能部件和核心(不是?UI)功能部件。如果您的插件沒有按這種方法進(jìn)行劃分,您可能會馬上考慮重新設(shè)計它們。功能部件也可以用來自動編譯處理被引用的插件。?
主要功能部件標(biāo)識一個產(chǎn)品(但是您有控制權(quán))?
雖然功能部件很多,但是當(dāng)您啟動?Eclipse?的時候,只有一個功能部件處于控制之下。這個主要功能部件決定了產(chǎn)品的標(biāo)識和其他運(yùn)行期行為,包括確定名字和與運(yùn)行期平臺相關(guān)聯(lián)的圖示,以及對所有插件默認(rèn)屬性值的重新定義選項(xiàng)。在后面的定義您自己的全局屬性中可以看到,這個功能強(qiáng)大的選項(xiàng)使您可以定制您自己的?Eclipse?設(shè)置。?
功能部件構(gòu)建插件(如果您允許它們)?
插件開發(fā)環(huán)境(PDE)可以自動完成為完整的運(yùn)行期環(huán)境準(zhǔn)備功能部件和插件的大部分工作。參見?Eclipse.org?中文章的討論?"PDE?生成插件"(在后面的參考資料中有相關(guān)鏈接)。這些基本的步驟在The?Java?Developer´s?Guide?to?Eclipse(同樣參閱后面參考資料中的鏈接)中也曾作為一個練習(xí)涉及到,遵循那個練習(xí)您可以構(gòu)建并標(biāo)識您已有的插件。可以說如果您有一個功能部件,并且了解?PDE?如何幫助您構(gòu)建插件和功能部件,您就可以構(gòu)建一個功能部件,然后讓它去同時構(gòu)建所有相關(guān)的插件。構(gòu)建控制策略(bin.excludes?與?bin.includes)將在后面的使用?PDE?構(gòu)建功能部件的策略中討論。這些策略是對?Eclipse.org?文章以及The?Java?Developer´s?Guide?to?Eclipse一書的補(bǔ)充。?
平臺配置管理?
理解功能部件所需要條件有助于理解它們?nèi)绾螌顒优渲弥锌捎玫膬?nèi)容進(jìn)行管理。?
啟動過程?
如果是一個剛解壓縮的?Eclipse?平臺,那么當(dāng)您啟動?eclipse.exe?的時候?qū)l(fā)生:?
安裝可能已經(jīng)完成?
如果一個工作區(qū)已經(jīng)存在,那么會有一個?.metadata\.config\platform.cfg?配置文件。?
如果您是以常規(guī)方式安裝?Eclipse,您得運(yùn)行?eclipse?-initialize?命令來生成一個默認(rèn)的初始化配置文件,放置在?eclipse\.config?目錄下。這樣當(dāng)?Eclipse?以新的工作區(qū)啟動時不再出現(xiàn)?Completing?the?install?的圖示。?
找到?Java?運(yùn)行期環(huán)境(JRE)。默認(rèn)情況下,Eclipse?首先查找?exlipse\jre?子目錄。如果沒有找到,Eclipse?將查找在系統(tǒng)中注冊的?Java?運(yùn)行期環(huán)境。?
注意:-vm?dir-location?參數(shù)可以用到指定其他的?JRE。?
配置被作為新的工作區(qū)的一部分創(chuàng)建出來。新的工作區(qū)通常沒有任何的配置,所以您會在真正的?splash?圖標(biāo)之前看到一個圖標(biāo),通知您安裝設(shè)置完成。?
處理那些注冊到?Eclipse?的功能部件和插件,并創(chuàng)建在后面將會用于檢測變化的校驗(yàn)和。這些功能部件和插件或者位于當(dāng)前的?eclipse\features?目錄和?eclipse\plugins?目錄下,或者位于由鏈接文件指定的?eclipse\...?目錄結(jié)構(gòu)中。?
一旦?Eclipse?啟動,活動配置定義將包含在?.metadata\.config\platform.cfg?文件中。?
鏈接文件如何擴(kuò)展一個?Eclipse?安裝設(shè)置?
如果您已經(jīng)使用了一段時間的?Eclipse?或者在您的配置中添加了哪怕只是一個新的插件,您肯定知道?Eclipse?是到?eclipse\features?目錄和?eclipse\plugins?目錄下去查找功能部件和插件的。不過您是否知道,Eclipse?也會到文件系統(tǒng)的其他位置去查找功能部件和插件?如果在?eclipse\links?目錄下存在格式正確的鏈接文件,那么這些文件會被處理,相關(guān)聯(lián)的功能部件和插件(包括沒有相關(guān)功能部件的插件)在運(yùn)行期配置中都會是可用的。?
一個鏈接文件只是一個命名為?id.link?的任意文件,在這里?id?通常是正在被引用的根功能部件的?id。您可以在鏈接文件目標(biāo)中定義不只一個功能部件,并且名字命名為?foo.link?彩強(qiáng)梢越郵艿摹8鲆桓靄縵履諶蕕牧唇游募?
path=E:/Eclipse-2.1.1/installedFeatures/Examples?
Eclipse?將會到指定的目錄下去查找?eclipse\features?目錄和?eclipse\plugins?目錄,看是否有合法的功能部件和(或)插件。也就是說,目標(biāo)目錄必須包含一個?\eclipse?目錄。如果找到,附加的功能部件和插件在運(yùn)行期配置是將是可用的,如果鏈接文件是在工作區(qū)創(chuàng)建之后添加的,附加的功能部件和插件會作為新的配置變更來處理。?
使用鏈接文件來定制您自己的?Eclipse?安裝設(shè)置的策略將在本文稍后的使用鏈接文件管理?Eclipse?安裝設(shè)置中進(jìn)行討論。?
配置更新?D?D添加一個功能部件?
如果一個新的功能部件及所用到的插件已經(jīng)添加到已有的?\features?目錄和?\plugins?目錄下,或者通過一個鏈接文件注冊到?Eclipse,校驗(yàn)和的變化將觸發(fā)配置處理過程。這個處理在一個簡單的?splash-flash?之后進(jìn)行。新的功能部件作為一個配置變更來處理,并且顯示出一個配置變更的對話框。?
例如,如果您打開一個標(biāo)準(zhǔn)的?Eclipse?解壓縮環(huán)境的工作區(qū),而后找到了?Eclipse?Examples,您把它解壓縮到與?Eclipse?同樣的目錄樹中或者添加了一個鏈接文件來指明這個例子解壓縮到了何處,將會出現(xiàn)一個如圖1所示的對話框。?
所以,如果您看到類似于這樣的一個對話框,那是因?yàn)樵谀\(yùn)行一個安裝配置程序的時,您自己或者其他人修改了?Eclipse?的配置,而平臺發(fā)現(xiàn)了新的或者更新過的可用功能部件。如果條目可以被選中,您可以將這個變化添加到您當(dāng)前的配置中。如果條目被禁用,說明存在配置上的問題,這個功能部件不能被添加進(jìn)來。按下?Error?Details?按鈕可以查看有關(guān)配置問題的信息。?
配置管理注解:?
存在未決變更并不意味著您不得不馬上接受它們,在相當(dāng)一段時間內(nèi)您完全可以不去理會它們,只需要取消對條目的選擇,并點(diǎn)擊?Finish即可。要在以后再添加它們,您可以選擇 Help?>?Software?Updates?>?Pending?Changes... 來再次打開那個對話框。?
已經(jīng)被接受的變更在以后還可以禁用。打開?Install/Update?透視圖,在?Install?Configuration?視圖中選中功能部件,然后在?Preview?視圖中選擇?Disable?。禁用的功能部件還可以通過類似的步驟啟用。在?Install?Configuration?視圖中點(diǎn)擊?Show?Disabled?Features?圖標(biāo)可以顯示被禁用的功能部件。?
功能部件在運(yùn)行期標(biāo)識組件?
Eclipse?允許標(biāo)識活動產(chǎn)品,也可以選擇標(biāo)識運(yùn)行期配置中的每一個功能部件。功能部件不是必須要標(biāo)識出來,您可以不標(biāo)識您所有的功能部件,但是您應(yīng)該至少標(biāo)識一個。?
標(biāo)識定義?D?D插件的工作?
添加標(biāo)識的關(guān)鍵問題是要明白把標(biāo)識的定義在哪里。您定義標(biāo)識的是功能部件,但是標(biāo)識的內(nèi)容是來自于插件。或者插件與功能部件的?id?相同(默認(rèn)的情形),或者插件在功能部件的定義中被明確標(biāo)識(這是?Eclipse?2.1.1?的新增功能)。在?Eclipse?2.1?中,一個功能部件定義可以通過在?feature.xml?文件中指定屬性?plugin=…?來定義其他插件。?
插件包含了用于定義和提供標(biāo)識內(nèi)容的文件。?
標(biāo)識內(nèi)容概要介紹?
about.ini?控制文件定義了產(chǎn)品級和功能部件級的標(biāo)識。產(chǎn)品標(biāo)識必須正確包含以下兩方面內(nèi)容:?
功能部件必須被定義為一個可能的主要功能部件,即在?feature.xml?定義文件中要包含?primary="true"。?
功能部件必須被標(biāo)識為活動的主要功能部件,在產(chǎn)品中通常是在?\eclipse?目錄下的?install.ini?文件中的條目來設(shè)置。主要功能部件也可以在運(yùn)行期通過使用?-feature?featureId?啟動參數(shù)來定義。?
理解功能部件標(biāo)識的最簡單的辦法是去查看在?about.ini?控制文件中定義了哪些元素,以及它們在一個被標(biāo)識的產(chǎn)品或功能部件中如何起作用。?
以下幾條僅用于產(chǎn)品標(biāo)識:?
windowImage?
appName?
aboutImage?
其余條目在產(chǎn)品及功能部件標(biāo)識過程中使用。?
以百分號(%)開頭的值在?about.properties?文件中解析。當(dāng)一個功能部件是主要功能部件時,用?abouText?關(guān)鍵字定義的文本會在?About?product?對話框中顯示。當(dāng)用戶點(diǎn)擊?Feature?Details?按鈕時,隨后彈出的?About?Features?對話框中也會顯示這些本文內(nèi)容。?
功能部件被加入到運(yùn)行期配置時,會打開?welcomePage?條目指定的歡迎頁面,其后還可以通過選擇?Eclipse?菜單選項(xiàng)?Help?>?Welcome...?打開的?Welcome?選擇對話框打開這個歡迎頁面。?
構(gòu)建一個可行的有標(biāo)識的功能部件的最快速方法是克隆一個在?Eclipse?本身中可以找到的一個現(xiàn)有的功能部件。具有?org.eclipse.platform?id?的功能部件和插件會提供功能部件標(biāo)識和插件標(biāo)識。在The?Java?Developer´s?Guide?to?Eclipse一書第34章練習(xí)7中有一個步驟詳盡的指導(dǎo)說明。?
在?Eclipse.org?的更新管理器子工程的開發(fā)資源中,您可以找到另外一些關(guān)于標(biāo)識的詳細(xì)說明(參見參考資料中的鏈接)。?
使用?PDE?構(gòu)建功能部件的策略?
在The?Java?Developer´s?Guide?to?Eclipse一書中關(guān)于功能部件開發(fā)的章節(jié)和?Eclipse.org?的文章?"PDE?生成插件"中都對構(gòu)建功能部件的過程進(jìn)行了介紹,但是也還有一些其他的途徑。當(dāng)您理解了如何使用?PDE?來構(gòu)建功能部件和相關(guān)聯(lián)的插件之后,您可以讓這些步驟自動完成。?
由?PDE?實(shí)現(xiàn)的?Ant?目標(biāo)?
讓我們從對?PDE?所提供功能概要介紹開始講起。PDE?將為一個?plugin.xml?或?feature.xml?文件生成?build.xml?文件。Build.xml是一個?Ant?腳本,可以完成運(yùn)行期平臺的功能部件和插件所需要的不同任務(wù)。PDE?構(gòu)建過程允許您生成下列構(gòu)建目標(biāo)中的一個或多個。?
重要的功能部件構(gòu)建目標(biāo):?
build.jars?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.jars?任務(wù)。?
build.update.jar?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.update.jars?任務(wù)。同時會為功能部件創(chuàng)建一個?Update?JAR。這是?Ant?腳本的默認(rèn)目標(biāo)。?
build.sources?為每一個引用到的插件調(diào)用?build.xml?文件中的?build.source?任務(wù)。?
zip.distribution?創(chuàng)建一個包含功能部件和引用到的插件所需要的所有文件的壓縮文件。?
refresh?使?Eclipse?刷新功能部件工程及任何引用到的插件的工程。?
重要的插件構(gòu)建目標(biāo):?
build.jars?為插件定義的每一個運(yùn)行期?JAR?調(diào)用?build.xml?文件中的許多目標(biāo)。被調(diào)用的目標(biāo)的名字與運(yùn)行期?JAR?文件的名字相同。這些目標(biāo)編譯?Java?代碼并創(chuàng)建?JAR?文件,包含任何在源文件目錄下的資源。?
build.update.jar?將所有運(yùn)行期插件目錄下所有需要的文件壓縮打包為一個名字為?plugin.id_version.jar?的文件,在這里?plugin.id?和?version?來自于?plugin.xml?文件。這是?Ant?腳本的默認(rèn)目標(biāo)。?
build.sources?基于給定的運(yùn)行期?JAR?文件所定義的源文件目錄,創(chuàng)建?Java?源文件的壓縮包。?
zip.plugin?創(chuàng)建一個包含有插件所需要的所有內(nèi)容的壓縮包。?
refresh?使?Eclipse?刷新插件工程。?
注意:在功能部件和插件的Ant?處理過程中,更新?JAR?或生成壓縮包的處理過程中打包的文件,是運(yùn)行期環(huán)境所需要的那些文件。這些內(nèi)容在功能部件或插件的?build.properties?文件和在?plugin.xml?中定義的每一個插件的運(yùn)行期?JAR?文件中,通過?bin.includes?或者?bin.excludes?條目來描述。?
為了構(gòu)建一個插件,您可能會指定?clean,build.sources,build.jars,zip.plugin,refresh。為了構(gòu)建一個功能部件,您可能會指定clean,build.sources,build.jars,zip.distribution,refresh。您或許會想要在開始時使用?clean?來強(qiáng)制重新生成所有結(jié)果,經(jīng)常會有這種情況。盡管?Ant?處理過程將基于輸入的變化重新執(zhí)行所需要的步驟,但是有一些變化不會觸發(fā)所有需要的處理過程。測試結(jié)果表明如果您改變了一個?Java?源文件,相應(yīng)的源文件壓縮包將會更新,但是類不會被重新編譯,運(yùn)行期?JAR?也不會被更新。所以安全起見,建議您先將輸出結(jié)果清空,以保證您在重新構(gòu)建后所使用的是對應(yīng)于當(dāng)前源文件的運(yùn)行期版本。?
討論方案?
為了進(jìn)行討論,我們先描述一下只有一個功能部件和插件時在運(yùn)行期配置中需要的內(nèi)容。?
組件結(jié)構(gòu)示例?
組件類型?
文件?
功能部件?
feature.xml?
feature_image.jpg?
/license/license.html?
/license/license.pdf?
/plan/project-plan.doc?
插件?
plugin.xml?
/images/action.gif?
/images/editor.gif?
/src/co/pkg/id/action.java?
/src/co/pkg/id/editor.java?
/design-docs/plug-in.doc?
/design-docs/editor.doc?
正如您所看到的文件名,雖然這些文件大部分屬于運(yùn)行期環(huán)境,還是有一些文件不是您想要與其他人共享的(例如,您的設(shè)計文檔)。?
包含策略?D?D指出所需要的部分?
至少到剛開始時,最簡單的方法是,在構(gòu)建過程中將您要打包的部分作為在運(yùn)行期配置中功能部件或插件的一部分而列出來。相應(yīng)的?build.properties?文件分別如下所示:?
build.properties?內(nèi)容?
組件?
build.properties?文件內(nèi)容?
功能部件?
bin.includes?=?feature.xml,\?
license/?
插件?
source.runtime.jar?=?src/?
bin.includes?=?plugin.xml,\?
images/?
排斥策略?D?D指定不需要的或私有的部分?
另一種方法是把您不想打包的部分在構(gòu)建過程中作為功能部件或插件的一部分列出來。這不僅要包括您不想共享的文件,還要包括構(gòu)建過程中創(chuàng)建的文件和目錄(有一些是臨時的)。這種方法用到的?build.properties?文件如下:?
build.properties?內(nèi)容?
組件?
build.properties?文件內(nèi)容?
功能部件?
bin.excludes?=?temp.folder/,\?
com.ibm.master.lab.core_1.0.0.bin.dist.zip,\?
.classpath,\?
.project,\?
build.xml,\?
build.properties?
插件?
bin.excludes?=?temp.folder/,\?
bin/,\?
.classpath,\?
.project,\?
build.xml,\?
build.properties,\?
makesrczip.xml,\?
src/?
如果給定功能部件或插件的?id?值為?com.your.feature.id?或者?com.your.plugin.id,那么您在使用排斥策略的時候還需要在文件中包括以下條目:?
com.your.feature.id_1.0.0.bin.dist.zip,\?
com.your.feature.id_1.0.0.jar,\?
com.your.plugin.id_1.0.0.jar,\?
zip?條目將使生成的組件壓縮包不被?update?JAR?或者組件壓縮包自己所包含。JAR?條目將使生成的功能部件或插件的?update?JAR?不被組件壓縮包或者?update?JAR?自己所包含。?
當(dāng)您的組件壓縮包或者?update?JAR?看起來比它應(yīng)該的大小要大,或者在每次您進(jìn)行編譯時包的大小呈跳躍式增長,說明您應(yīng)該執(zhí)行以上步驟了。您需要在適當(dāng)?shù)墓δ懿考蛘卟寮?build.properties?文件中加入以上條目來解決這個問題。?
對文件或者結(jié)構(gòu)變化的響應(yīng)?
除了以上提到的之外,當(dāng)一個新的文件或目錄添加到功能部件或者插件時,還有必需的響應(yīng)需要考慮。我們的意思是您得讓您的功能部件和插件能應(yīng)付可能的改變,也就是說它們分別需要一個?feature.properties?文件和一個?plugin.properties?文件。當(dāng)您用包含策略時,您需要給?.properties?文件添加一個適當(dāng)?shù)膶傩裕绻鞘褂门懦獠呗缘脑捑筒挥眠@樣做了。?
不論哪種方法,如果您把一個文件添加到一個目錄,那么不需要做任何其他的改動。對于新添加的文件,如果使用的是包含策略,它會被發(fā)送處理,如果使用的是排斥策略,它將不會被發(fā)送處理。這實(shí)際上是您可能應(yīng)該要考慮使用不同的目錄來存放不同的文件的原因。例如,您的插件所用到的所有圖片所在的目錄應(yīng)該被包含在內(nèi),而一個開發(fā)過程中存放插件的設(shè)計討論或文檔的目錄則不然。?
最壞的情形是當(dāng)您忘記對?build.properties?進(jìn)行更新時:會發(fā)生運(yùn)行期失敗或生成內(nèi)容存在差錯的產(chǎn)品。如果您使用包含策略,新加入的文件或目錄在打包后是不可用的,這有可能會導(dǎo)致您的插件不能用或者顯示出?Eclipse?默認(rèn)的圖標(biāo)(紅盒子)。如果是使用排斥策略添加新文件或目錄,這些文件或目錄的內(nèi)容在打包過程中會被包含進(jìn)來。根據(jù)您的風(fēng)格選擇適當(dāng)?shù)姆椒ǎ瑥亩涯泩?zhí)行更新時的風(fēng)險降到最低。這將取決于您所面臨的主要問題:是功能部件或插件不能運(yùn)行,還是其他人本不應(yīng)該看到運(yùn)行期目錄下的文件。?
組織功能部件?
當(dāng)您在開發(fā)您的工具時,您是否考慮到了需要多少個插件?答案是至少三個:一個是您的模型,也就是非?UI?的核心部分,一個是您的?UI?內(nèi)容,還有一個或多個是用于提供幫助內(nèi)容。如果您注意過,您會發(fā)現(xiàn)這是?Eclipse?本身的基本模式(jdt.core,?jdt.ui,?jdt.doc;?debug.core,?debug.ui;等等)。?
這樣劃分的原因之一是,相對于不用于?UI?的插件來說,用于?UI?的插件在運(yùn)行期需要不同的?Eclipse?組件的支持(org.eclipse.ui)。?
包含其他功能部件?
功能部件如果沒有被其他功能部件包含,那么在?Eclipse?配置中都會被配置為根功能部件。默認(rèn)情況下,根功能部件可以由用戶在?Install/Update?透視圖中禁用或啟用,并且可以在?feature.xml?文件中確定一個更新?URL。當(dāng)包含一個功能部件時,只有在根功能部件中的更新?URL?會被處理,否則只能通過?search-location?定義特別許可才可以。?
通過包含功能部件,您可以管理包的組織結(jié)構(gòu)。您可能會有多個功能部件,但只有一個做過標(biāo)識,其余的或者是用來構(gòu)成結(jié)構(gòu),或者是用來管理組件。請記住是根功能部件來定義更新的站點(diǎn),盡管這個角色可以由功能部件委派給它所包含的功能部件,通過設(shè)置?search-location?屬性值為?selfboth。?
如果您正在構(gòu)建一個基于?Eclipse?的產(chǎn)品,您可能希望您的一個功能部件來包含?Eclipse?功能部件樹。對于標(biāo)識這個產(chǎn)品來說這并不需要,但是您可以指定另外的更新站點(diǎn)(Eclipse?自己用的是?

可選功能部件的角色?
當(dāng)將一個功能部件包含到另一個功能部件時,您可以選擇是否把它設(shè)置為可選的。主要原因是創(chuàng)建這樣的結(jié)構(gòu)可以讓用戶根據(jù)他自己的需要來禁用您提供的組件的一部分。?
當(dāng)新的功能部件包含有可選功能部件,但那些可選功能部件并不存在時,Eclipse?的配置邏輯不允許添加這個新的功能部件。也就是說,如果適當(dāng)?shù)南葲Q條件成立,可以使用可選功能部件來創(chuàng)建層結(jié)構(gòu)。不過需要將這些層存貯在不同的目錄樹下,并且每層使用單獨(dú)的鏈接文件。您可以添加到?Eclipse?配置以增加其功能的鏈接文件的沒有數(shù)目上的限制。?
讓?Eclipse?(或者任何基于?Eclipse?的產(chǎn)品)以您的方式工作?
現(xiàn)在向您講明了兩點(diǎn):指定的主要功能部件控制整個產(chǎn)品的標(biāo)識和默認(rèn)屬性,Eclipse?可以在安裝配置目錄下或者任何一個鏈接的?Eclipse?目錄結(jié)構(gòu)下找到組件。這意味著您可以改變?Eclipse?(存在相關(guān)風(fēng)險,不過僅僅意味著您修改時需要小心!)。這些改變可以幫助您管理基于?Eclipse?的安裝配置,并使之支持您個人所喜好的屬性規(guī)則。?
使用鏈接文件來管理?Eclipse?安裝配置?
您可能會希望能對環(huán)境進(jìn)行更多的管理,而不是毫無選擇地將所有的插件(我希望是引用到的功能部件)全部安裝到您的?Eclipse?目錄樹下。如果您需要更新?Eclipse,實(shí)際上您并不想要另外再裝一個新的?Eclipse?或者在列表中去查找您所想要的功能部件和插件。?
下面是一種借助鏈接文件來組織您的?Eclipse?或者基于?Eclipse?的產(chǎn)品和構(gòu)件的方法:?
保持?Eclipse?或者基于?Eclipse?的產(chǎn)品是干凈的。也就是說,不要把您的任何功能部件或者插件添加到?eclipse\features?和?eclipse\plugins?目錄下。?
在已有的?eclipse?目錄下創(chuàng)建一個?eclipse\links?目錄和一個?eclipse\links-out?目錄。如果您用的是基于?Eclipse?的產(chǎn)品,那么可能已經(jīng)存在?eclipse\links-out?目錄。這個目錄并不特殊,只是一個用來方便存放不用的鏈接文件的地方。?
為您要添加到您的配置中的功能部件和插件創(chuàng)建一個或多個?add-ons?的目錄。在這些目錄下,創(chuàng)建一個?eclipse\features?和一個?eclipse\plugins?目錄結(jié)構(gòu)。?
為每一個?add-ons?目錄在?eclipse\links-out?目錄下創(chuàng)建一個鏈接文件。將那些您當(dāng)前要添加到您的活動配置中去的鏈接文件拷貝到?eclipse\links?目錄。?
例如,假定您將?Eclipse?解壓縮到一個名為?Eclipse-2.1.1?的目錄下,然后創(chuàng)建一個名為?CoolTools?的?add-ons?目錄,也放在?Eclipse-2.1.1?目錄下。在?CoolTools?目錄下,您可以有多個目錄,每個目錄用于一個或一族您要添加到?Eclipse?的工具。您的目錄結(jié)構(gòu)可能會如圖3所示?
EditorList.link?文件要包含下面其中一條(不能是全部)?
path=D:/Eclipse-2.1.1/CoolTools/EditorList?
path=D:\\Eclipse-2.1.1\\CoolTools\\EditorList?
斜杠是一條(/)還是兩條(\\)取決于目錄結(jié)構(gòu)。?
確認(rèn)條目不要以空格結(jié)尾,因?yàn)檫@樣?Eclipse?會忽略它?D?D我第一次用鏈接文件時用了好幾個小時才弄明白這一點(diǎn)。?
如果您使用一個新的工作區(qū)來啟動?Eclipse,所有?Eclipse?自帶的以及通過鏈接文件找到的功能部件和插件都是可用的。如果您要添加一個鏈接文件,并使用現(xiàn)有的工作區(qū)重新啟動?Eclipse,Configuration?Changes?對話框就會彈出。如果您刪除了一個鏈接文件(很簡單,只是把它移到?\links-out?目錄下),配置的變化也會被?Eclipse?注意到,但您能看到的僅僅是?splash-flash。?
實(shí)際上您不是必須將鏈接文件移入移出來控制配置,更好的辦法是用?Install/Update?透視圖來調(diào)整配置。當(dāng)然,可以這樣做的前提是您的插件都屬于功能部件(看,這是另外一個需要功能部件的理由)。使用?Eclipse?進(jìn)行配置的調(diào)整將以后面討論。?
使用?Install/Update?透視圖來修改配置?
根功能部件,以及任何定義為可選擇的功能部件,都可以在當(dāng)前配置中禁用。被禁用后,功能部件仍然可以被平臺認(rèn)出;它們只是不再包含在當(dāng)前的運(yùn)行期配置中。?
前面我們談及了將?Eclipse?Examples?添加到活動配置中。添加后,我們可以使用?Install/Update?透視圖來禁用它。如果您正打開一個包含有?Eclipse?Examples?的?Eclipse?配置的?Install/Update?透視圖,您看到的將如圖4?所示?
在?Preview?視圖中點(diǎn)擊?Disable?Now?按鈕,您就可以將?Eclipse?Examples?功能部件從運(yùn)行期配置中臨時移除。點(diǎn)擊后,Eclipse?將提示您重新啟動平臺來使配置的修改生效。?
Eclipse?Examples?功能部件在當(dāng)前配置中將不再可見(或者說不是活動的)。為了能再次看到這個功能部件并啟用之,您需要在?Install?Configuration?視圖中點(diǎn)擊?Show?Disabled?Features?開關(guān)按鈕(見圖5)。?
由于?Eclipse?Examples?功能部件是一個根功能部件,所以可以這樣做。如果您在?Eclipse?SDK?中瀏覽其他功能部件,您將發(fā)現(xiàn)它們在?Preview?視圖中沒有相應(yīng)的?Disable?Now?按鈕,這是因?yàn)樗鼈儽欢x為必需的。?
如果您用的是?Eclipse?SDK,您應(yīng)該會有默認(rèn)配置的平臺、JDT?和?PDE。如果您正在做一些插件的開發(fā),但是您不需要?PDE??或者在一些情況下,您不是總需要?JDT??您只要對?Eclipse?做一個小的修改就可以禁用這些功能部件。打開?org.eclipse.platform.sdk.win32?功能部件的?feature.xml?文件,將以下幾行修改為包含?optional="true"?屬性。?
清單?1.?禁用?PDE?和?JDT?
<includes?id="org.eclipse.platform.win32"?version="2.1.1"?match="equivalent"/>?
<includes?id="org.eclipse.jdt"?version="2.1.1"?match="equivalent"?optional="true"/>?
<includes?id="org.eclipse.pde"?version="2.1.0"?match="equivalent"?optional="true"/>?
<includes?id="org.eclipse.platform.win32.source"?version="2.1.1"?match="equivalent"?
optional="true"/>?
<includes?id="org.eclipse.jdt.source"?version="2.1.1"?match="equivalent"?optional="true"/>?
現(xiàn)在您可以在?Install?Configuration?視圖中選擇這些功能部件并禁用它們。如果所有前面提到那些定義為可選擇的功能部件都被禁用,平臺依然可以運(yùn)行。并且,您隨時可以重新啟用它們。圖6?是?Install?Configuration?視圖中顯示的被禁用的功能部件。?
圖?6.?禁用?Eclipse?多個的功能部件?
這些禁用/啟用的設(shè)置都是僅對于當(dāng)前工作區(qū)有效。您可以有另外的活動工作區(qū),其中包含有部分或全部在當(dāng)前工作區(qū)中被禁用的功能部件。?
這個簡單的例子說明了使用功能部件的優(yōu)勢(它們可以被禁用)和使用鏈接文件來將所有可能的功能部件添加到您的配置的意義所在。在一個給定的工作區(qū)中將您所不需要的功能部件禁用,這樣就可以優(yōu)化當(dāng)前配置。?
定義自己的全局屬性?
Eclipse?是一個優(yōu)秀的工具,但是同任何工具一樣,您得對它進(jìn)行定制,它才能是完美的。工具提供了屬性頁面來讓您改變工具的行為或可視化顯示。最新統(tǒng)計,在?Eclipse?中有?62?個屬性頁面。幾乎每次您使用到一個新工具,您都會發(fā)現(xiàn)有些選項(xiàng)您想要修改。但是當(dāng)您使用多個工作空間時,或者是在一個團(tuán)隊的環(huán)境中工作,有一些選項(xiàng)需要與他人協(xié)調(diào),這樣就出現(xiàn)了如何在跨工作空間以及與他人協(xié)調(diào)工作時對選項(xiàng)進(jìn)行最佳管理的問題。?
Eclipse?提供了導(dǎo)入/導(dǎo)出屬性的功能。在任何一個屬性對話框中,您都可以將屬性導(dǎo)出到一個?.epf?文件中。當(dāng)使用其他工作區(qū)或與他人共享時,可以再次導(dǎo)入這個文件。您甚至可以將它添加到工程中與團(tuán)隊成員共享,以便每個人都可以得到標(biāo)準(zhǔn)的屬性。?
但是這樣做會變得單調(diào)而乏味,并且如果您忘記了就麻煩了。在使用?Eclipse?或任何基于?Eclipse?的產(chǎn)品時,您應(yīng)該意識到還有另外一種方法可以定義全局屬性。您可以通過修改主要功能部件的?plugin_customization.ini?文件來定制屬性的默認(rèn)值。?
您可以在?eclipse?目錄下的?install.ini?文件中找到主要功能部件。例如,在標(biāo)準(zhǔn)的?Eclipse?解壓縮中的?install.ini?的內(nèi)容如下:?
清單?2.?標(biāo)準(zhǔn)的?Eclipse?解壓縮中的?install.ini?的內(nèi)容?
#?install.ini?
#?java.io.Properties?file?(ISO?8859-1?with?"\"?escapes)?
#?This?file?does?not?need?to?be?translated.?
#?Required?property?"feature.default.id"?contains?the?id?of?the?primary?feature?
#?(the?primary?feature?controls?product?branding,?splash?screens,?and?plug-in?customization)?
feature.default.id=org.eclipse.platform?
#?Required?property?"feature.default.application"?contains?id?of?the?core?
#?application?that?gets?control?on?startup.?For?products?with?a?UI,?this?
#?is?always?org.eclipse.ui.workbench;?for?"headless"?products,?this?is?product-specific.?
feature.default.application=org.eclipse.ui.workbench?
feature.default.id=…?指定了默認(rèn)的主要功能部件。要注意的是,通過在啟動?Eclipse?時使用?-feature?選項(xiàng),可以把其他功能部件聲明為是主要的。?
同大部分功能部件控制和標(biāo)識一樣,實(shí)際的工作都是在功能部件相關(guān)聯(lián)的插件中完成的。對于?Eclipse來說,這是一個?id?與功能部件相同的插件,org.eclipse.platform?插件。如果您仔細(xì)查看這個作為主要功能部件標(biāo)識的插件,您將發(fā)現(xiàn)一個名為?plugin_customization.ini?的文件。這個文件的內(nèi)容與導(dǎo)出屬性的文件類似。當(dāng)?Eclipse?啟動時會讀取這個文件,并用來指定所有默認(rèn)的屬性值,而不是去使用插件本身定義的那些值。這就使得產(chǎn)品,或者說是您,可以改變插件的行為。默認(rèn)的?plugin_customization.ini?文件的內(nèi)容只有一條:?
清單?3.?默認(rèn)的?plugin_customization.ini?文件 ?
#?plugin_customization.ini?
#?sets?default?values?for?plug-in-specific?preferences?
#?keys?are?qualified?by?plug-in?id?
#?e.g.,?com.example.acmeplugin/myproperty=myvalue?
#?java.io.Properties?file?(ISO?8859-1?with?"\"?escapes)?
#?"%key"?are?externalized?strings?defined?in?plugin_customization.properties?
#?This?file?does?not?need?to?be?translated.?
#?Property?"org.eclipse.ui/defaultPerspectiveId"?controls?the?
#?perspective?that?the?workbench?opens?initially?
org.eclipse.ui/defaultPerspectiveId=org.eclipse.ui.resourcePerspective?
這一條目指定了打開新的工作區(qū)時以及當(dāng)您關(guān)掉所有的透視圖后關(guān)閉?Eclipse?時打開的透視圖。如果您使用的基于?Eclipse?的產(chǎn)品,這個條目可能有所不同。?
指定要包含的屬性的過程比較費(fèi)事,但至少您應(yīng)該做如下步驟:?
1.?啟動一個干凈的工作區(qū)。?
2.?修改您想要改變的一個屬性。?
3.?將屬性導(dǎo)出到一個?.epf?文件。?
4.?在導(dǎo)出的文件中找到新的健值,并確定它是否反映了您剛剛所做的改變。?
5.?將一個或多個鍵的條目拷貝到標(biāo)識插件(使用?Eclipse?時這個插件是?org.eclipse.platform)的?plugin_customization.ini?文件中。?
6.?測試結(jié)果,或者保留新的鍵,或者再試一次。?
注意:如果您不習(xí)慣于去更新產(chǎn)品的?plugin_customization.ini?文件,您可以在其他位置創(chuàng)建一個這個文件的拷貝,在啟動?Eclipse?或基于?Eclipse?的產(chǎn)品時使用參數(shù)來指定它。?
eclipse?-plugincustomization?myCustomDefaults.ini?
全局屬性示例?
前面提到了一些相關(guān)技術(shù)的描述,并提出了對您可能希望包含到您定制的?plugin_customization.ini?文件中的一些值的建議,這里給出了示例屬性重寫,作為對前面兩方面的內(nèi)容的說明。?
我們將把它們根據(jù)我定制的目的在邏輯上分為的幾部分來介紹。您可以下載完全的插件?customization.ini?文件。?
視圖欄默認(rèn)是在底部,但我喜歡把它們放在頂部:?
#?View?tabs?at?the?bottom?
org.eclipse.ui.workbench/VIEW_TAB_POSITION=128?
新工作區(qū)打開時不打開歡迎頁面,并且在關(guān)閉工作臺時不再提示:?
#?No?welcome?dialog?at?open?and?no?confirm?on?close?
org.eclipse.ui.workbench/WELCOME_DIALOG=false?
org.eclipse.ui.workbench/EXIT_PROMPT_ON_CLOSE_LAST_WINDOW=false?
在打開新工程向?qū)耐敢晥D時,禁用提示或其他動作:?
#?Never?change?to?perspective?required?by?new?project?wizard?(no?prompt)?
org.eclipse.ui.workbench/SWITCH_PERSPECTIVE_ON_PROJECT_CREATION=never?
定義另外的默認(rèn)文本字體:?
#?Default?text?font?(leaks?into?Java?editor)?
#?Note:?you?have?to?touch?the?font?page?and?say?OK/Apply?(probable?bug)?
org.eclipse.ui.workbench/org.eclipse.jface.textfont=?
1|Lucida?Console|9|1|WINDOWS|1|-15|0|0|0|700|0|0|0|0|3|2|1|49|Lucida?Console;?
注意:字體屬性條目比較特殊,對它的修改不會立即生效。如果您訪問字體屬性頁,前面所定義的內(nèi)容會顯示出來,不過得在您選擇了?OK?或者?Apply?之后才會生效。我不能讓這個鍵保存下來用于?Java?文本字體。?
預(yù)定義附加的?Java?編輯器任務(wù)標(biāo)簽:?
#?Add?to?the?default?JDT?task?tags?(TODO?should?probably?be?left)?
org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.taskTags=TODO,Edu-Sol?
將對?Package?Explorer?的雙擊默認(rèn)設(shè)置為?Go?Into?動作:?
#?Package?Explorer?GoInto?on?Double?click?
org.eclipse.jdt.ui/packageview.doubleclick=packageview.gointo?
有一些沒有定義屬性頁面的選項(xiàng)也是可以定制的。在完成對?UI?的標(biāo)準(zhǔn)設(shè)置后導(dǎo)出的?.epf?文件中,我發(fā)現(xiàn)有一些?JDT?的選項(xiàng)值是作為屬性來保存的。?
這個屬性鍵是用于告知?JDT?UI?它要讀取屬性并用來改變默認(rèn)的?UI?行為:?
#?Tells?JDT?it?does?have?some?prefs?to?use?(forces?a?read?of?these?values)?
org.eclipse.jdt.ui/CustomFiltersActionGroup.org.eclipse.jdt.ui.PackageExplorer.?
TAG_DUMMY_TO_TEST_EXISTENCE=storedViewPreferences?
注意:如果沒有上面的這個屬性鍵,接下來的兩組設(shè)置將被忽略。?
活動?Package?Explorer?過濾器以屬性值的形式保存:?
#?Package?Explorer?filter?-?standard?JDT?defaults?+?library?filter?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer.LibraryFilter=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer_patternFilterId_.*=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer.PackageDeclarationFilter=true?
org.eclipse.jdt.ui/org.eclipse.jdt.ui.PackageExplorer_patternFilterId_**.class=true?
org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.PackageExplorer.EmptyInnerPackageFilter=true?
Outline?視圖有一個顯示選項(xiàng),可以在活動的?JDT?Java?編輯器中顯示內(nèi)容時減小樹的深度。這個圖標(biāo)有一個懸浮幫助?Go?Into?Top?Level?Type,由下面這個屬性項(xiàng)來控制:?
#?Outline?view?GoInto?Toggle?when?using?JDT?editor?
org.eclipse.jdt.ui/GoIntoTopLevelTypeAction.isChecked=true?
您可能會想要嘗試為更多的屬性指定新的默認(rèn)值,使用前面描述的方法然后核對一下結(jié)果即可。您或許會希望在一個臨時的工作區(qū)中做這些事情,達(dá)到修改的目的后,您可以按此去修改活動的主要功能部件的?plugin_customization.ini?文件(不要告訴任何人是我教您這樣做的!)。并且要注意的是,您可能會發(fā)現(xiàn)其他一些鍵被忽略了,這種情況我也曾遇到過,因?yàn)樽煮w是用于?JDT?的,因此這一條目加入到?plugin_customization.ini?文件后,在屬性頁中根本就不會體現(xiàn)出這種變化。?
結(jié)束語?
功能部件是?Eclipse?的幕后英雄--它們很重要,因?yàn)樗鼈兪?Eclipse?配置管理的組成部分,支持產(chǎn)品標(biāo)識,并且它們是在?Eclipse?平臺上構(gòu)建定制解決方案的產(chǎn)品的一部分。使用功能部件您可以:?
當(dāng)您使用基于?Eclipse?的產(chǎn)品進(jìn)行工作時,您可以根據(jù)功能部件標(biāo)識鑒別出是誰提供了哪些不同的可用功能?
對產(chǎn)品的標(biāo)識可以幫助進(jìn)一步定制?Eclipse?
在插件開發(fā)環(huán)境中自動完成任務(wù)?
通過禁用/啟用根功能部件,或者使用?Install/Update?透視圖來禁用/啟用定義為可選的被包含的功能部件,您可以動態(tài)地改變給定工作區(qū)的配置?
所以,使用功能部件吧,它可以幫助您自動完成構(gòu)建插件的一些步驟,使用文中提到的自定義?install/link?文件組織方法,可以使您的?Eclipse?環(huán)境更加好用。
Pat?McCarthy?
IBM資深軟件工程師?