<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    京山游俠

    專注技術,拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    現狀:
      五年前,我在博客中發了一系列用Eclipse RCP進行桌面開發的文章,最高訪問量達到了5萬多。那個時候,Eclipse RCP技術正剛剛起步,參考資料不是那么好找。五年后,當我再次關注Eclipse RCP時,它早已是如日中天,但國內的參考資料仍寥寥無幾。所以我決定再次寫一些關于Eclipse RCP的東西。
      GUI桌面編程這個話題本來就非常不好寫。這么多年,這么大一個領域,真真正正能寫成像《深入淺出MFC》這樣的經典的書籍沒有幾本。縱觀國內在該領域出版的書籍,要么就是大篇大篇羅列這個控件那個控件怎么用,控件有哪些屬性可以設置,有哪些事件可以處理;要么就是大段大段貼代碼,而對于GUI編程的一些本質、一些哲學性的東西沒有深入的分析。在Eclipse RCP領域尤其如此,有那么幾本打著Eclipse RCP和OSGi大旗的書籍,但是其參考價值卻不比Eclipse自帶的幫助文檔大多少,大有圈錢的嫌疑。
      Eclipse RCP是個好東西。用Eclipse RCP寫桌面程序,可以在一個很高的起點上構建自己的窗口應用,至于那種從頭開始寫窗口的日子是再也不復返了,甚至美工都不需要自己考慮了。(想想VC領域有多少界面庫在折磨著程序員。)還有一個好處當然是跨平臺了,雖然要背上一個Java虛擬機的負擔。(現在的Eclipse RCP程序導出時可以自己包含JRE,又大大簡化了程序部署的過程。)
      五年前我寫的那幾篇博文有很多缺點,缺點一是其中有些東西我自己都沒有搞懂,所以沒辦法寫得太深入;缺點二是跳躍性太大,總共才六篇,我卻又是展示COM組件,又是展示OpenGL,雖說讓大家在視覺上是狠狠體驗的一把,但是一點也不系統。所以這次一定要改變這些缺點,爭取做到以下目標:

    目標:
      1.言簡意賅,對于那些有助于理解Eclipse RCP平臺的核心概念重點點出,并結合實例。對于那種在Google上一查一大把的廢話堅決不寫;
      2.爭取系統性地介紹Eclipse RCP平臺可用的特性及其背后的一些設計模式,不再浮光掠影地一飄而過,也不專寫冷門偏門;
      3.不追求面面俱到,有些用不到的東西肯定沒必要講,也不怕別人說我水平差;
      4.當然是大量展示圖片啦。

    好了,下面開工,首先,當然是創建一個Hello World,初步展示一些Eclipse RCP的效果。Eclipse RCP編程的本質就是利用Eclipse的插件機制,在Eclipse的Runtime上進行擴展來構建我們自己的窗口程序,所以,創建項目的時候當然是創建一個Plug-in Project了。只是在下面那個“Would you like to create a rich client application ?”的地方選擇yes即可。


    一路Next下去,我就不多截圖了。在選擇應用程序模板的時候,選擇最簡單的Hello RCP即可。如果這時運行程序(用Run As -> Eclipse Application),可以得到一個簡單的窗口。

    為了顯示Hello World,我們需要一個擴展一個View。創建一個View類,其基類為org.eclipse.ui.part.ViewPart,如下圖:


    在HelloWorldView的代碼中,我們只需要一個SWT中的Label控件用來顯示HelloWorld,如下圖:


    下一步,就要把這個HelloWorldView插入到窗口中,這個可以通過配置Plugin的Extension來實現。打開plugin.xml的編輯器,增加一個org.eclipse.ui.views的擴展,如下圖:


    在Eclipse中,擴展的View并不是馬上顯示到前臺,而是要通過菜單Window->Show View來顯示,或者將View關聯到某個透視圖,切換透視圖的時候顯示這個View。我們的RCP程序的目標是單獨運行,而不是當插件安裝到Eclipse中,追求的是一運行程序就顯示這個View,所以還要擴展org.eclipse.ui.perspectiveExtensions。如下圖:


    運行程序,看看效果。通過Run As -> Eclipse Application運行,如下圖:


    到現在,我們的工作完成一半,因為該程序還只能在Eclipse中運行,要想脫離Eclipse單獨運行,必須將其作為單獨的產品導出。要導出產品,先要新建一個product configuration,然后進行配置。為簡單起見,我們只需要配置三個地方。
    第一個地方:Application,這個關系到程序的啟動點


    第二個地方,launcher,這個可以生成一個像eclipse那樣的本地啟動程序


    第三個地方,依賴項,可以先把自己添加到依賴項中,然后再點Add Required Plug-ins按鈕添加所有需要的依賴項




    我自己第一次接觸Eclipse RCP時,就經常因為不把自己添加到依賴項中而造成程序啟動失敗。

    下一步,導出程序,如下圖:


    在以上對話框中,我把能省的空都省了。最后得到的目標程序文件夾內容及運行程序的效果如下圖:


    以上過程非常簡單,所以先秀圖片。下面,來看看Eclipse RCP和OSGi的一些概念。
      1.Bundle和Bundle的生命周期:Bundle是OSGi的一個概念,我們可以把它理解為模塊、插件,如果僅僅只是學習Eclipse RCP編程的話,就不需要對OSGi進行深入學習,雖然它很流行。但是一些基本的概念還是要知道的。Eclipse完全構建在OSGi之上,它包含有一個OSGi規范的完整實現Equinox。所以Eclipse的一個Plug-in,基本上就等于OSGi的一個Bundle。我們不需要特意去編輯Bundle的定義文件META-INFO/MANIFEST.MF,在編輯plugin.xml的時候,Bundle的定義文件會自動更新。一個Bundle被安裝到OSGi系統中后,并不會馬上啟動,只有當這個Bundle提供的功能被調用的時候,該Bundle才會被啟動,當該Bundle不被用到的時候,它就可以被停止。在一個Bundle的生命周期中,我們可以定義自己的Activator來處理啟動、停止等各個階段的任務,這就是我們前面的例子中為什么要定義一個Activator的原因。通過Activator,我們可以查看OSGi系統中安裝的所有Bundle,因為OSGi系統調用Activator中的方法時,會傳遞一個BundleContext參數,使用該context,我們可以完全訪問整個OSGi系統的功能。
      2.Plug-in之間或Bundle之間的依賴關系:由于Plug-in和Bundle基本上是同義詞,所以在后文中我將不提Bundle。Eclipse的Plug-in機制早已深入人心,一個Plug-in經常會依賴于其它的Plug-in,這已經成為常識,不需要我贅述。Plug-in的定義中最重要的就是它的ID和Version,靠這兩個字段就可以唯一標識一個Plug-in,所以在前面的例子中,凡是出現ID的地方,我都很認真填寫,并且使用com.xkland.....這樣的形式來定義ID,避免出現沖突。對于Name、Vendor這樣的字段,明顯是給人閱讀的,所以就隨便填一填。
      3.還有比Plug-in更小的單位,那就是Package:雖然說Eclipse中的Plug-in是一個很小的單位了,但是還有更小的,那就是Package。如果有人不想依賴整個Plug-in的話,也可以單獨只Import幾個Package。當然,對于我們自己寫的Plug-in,也可以export一些Package供別人使用。在plugin.xml的編輯器中,有一個專門的頁面是用來設置和Package相關的內容的。在前面的例子中沒有演示這一點,因為我覺得我寫的程序還沒有必要分這么細。
      4.Extension和Extension Point:這個好像也早就是Eclipse領域常識性的概念了吧。在Plug-in中可以定義一些Extension Point,在別的Plug-in中可以擴展這些Extension Point。比如在前面的例子中,我們自己的Plug-in擴展了org.eclipse.core.runtime插件(叫Bundle可能更合適)和org.eclipse.ui插件定義的幾個擴展點,這些定義實在plugin.xml編輯器的Extensions頁面定義的。當然,我們的程序沒有定義自己的Extension Point,因為不需要讓別人去擴展什么。
      5.Product不是個什么重要的概念,從前面的例子可以看出,我們定不定義Product的ID都沒什么影響。不過要導出Product的時候,application一定要指定,依賴項也要搞清楚,因為這關系到我們的程序能不能成功運行。

      好了,概念性的東西就將這么多。OSGi不需要深究,因為我們會直接和Eclipse的Runtime打交道,以后會有專門的章節講Eclipse的Runtime提供有哪些服務。下面的例子演示即使不使用Native launcher,也可以通過OSGi框架啟動我們的Hello World。
      在導出Product的時候,選擇如下圖中的單選框和填寫好根目錄:

      就可以得到一個Repository,該Repository是供p2安裝程序使用的,里面沒有Native launcher。如下圖:

      在這個目錄里面建立一個configuration文件夾,里面放一個config.ini,記住,在Linux系統下,configuration文件夾一定要是rwx權限的哦。config.ini文件內容如下:

      該文件定義了OSGi啟動時安裝哪些Bundle,并且這些Bundle默認的啟動級別是多少。啟動級別的數字越小的越優先啟動。configuration/config.ini是OSGi啟動時默認的配置文件路徑,當然也可以使用-configuration選項更改為別的路徑。然后,如下命令啟動HelloWorld:

      在指定啟動OSGi的jar文件時,我偷了點懶,為了少敲幾下鍵盤,使用了一個通配符,大家還是可以很輕松地看出來是哪個文件哦?Equinox的官方文檔在這里:http://eclipse.org/equinox/documents/quickstart-framework.php
      如果想按照Equinox的官方文檔啟動OSGi框架的命令行,還得從Eclipse的安裝目錄找到如下幾個文件:

      然后還需要這樣一個config.ini文件:
    osgi.bundles=./org.apache.felix.gogo.runtime_0.10.0.jar@start,
         ./org.apache.felix.gogo.command_0
    .12.0.jar@start,
         ./org.apache.felix.gogo.shell_0
    .10.0.jar@start,
         ./org.eclipse.equinox.console_1
    .0.0.dist.jar@start,
     osgi.console.enable.builtin
    =false 
     osgi.console
    =<port> 

      才能夠按照Equinox的文檔那樣用java -jar org.eclipse.osgi_3.8.1.dist.jar -console啟動OSGi框架的命令行。

      從Hello World這個例子可以看出,我們的Eclipse RCP程序構建在org.eclipse.core.runtime和org.eclipse.ui這兩個Bundle上。下一篇,我將為大家講述這兩個Bundle能為我們提供哪些服務。

    下一篇
    Eclipse RCP詳解(02):Eclipse的Runtime和UI初探

    評論

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-01-09 10:02 by 鵬達鎖業
    過來學習一下。歡迎回訪

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-02-19 10:11 by Phnix
    Eclipse RCP e4與以前的比,有了很大的改動,比如css樣式支持之類,看LZ用的是3.x版本,LZ能否講些e4版本方面的知識,網上相關的信息好少。

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-02-19 22:37 by 海邊沫沫
    @Phnix
    Eclipse Wiki的RCP頁面中,有一個e4 RCP的tutorial很不錯。
    另外,直到目前的eclipse 4.3,e4 RCP的API都不是完整的,估計要期待ecliple 4.4。

    我的這一系列博文是有計劃的,準備講完eclipse 3.x RCP中的JFace和結構化數據,Core expression,Editor后,然后介紹e4 RCP。而且我在等Ubuntu 14.04的發布,因為我現在用的Eclipse 3.8.1是Ubuntu 13.10自帶的,它的特點就是在Ubuntu中使用非常漂亮,而我自己從eclipse官網下載的達不到這種效果。我希望14.04中自帶的是eclipse 4.x版。然后很自然過渡到e4 RCP。

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-02-20 09:15 by Phnix
    @海邊沫沫
    嗯。而且目前e4的資料還不夠豐富,碰到問題比較讓人著急。網上一搜,好多都是針對3.x版本的答案。

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示[未登錄]  回復  更多評論   

    2014-02-26 14:56 by haha
    請問eclipse是什么版本啊,怎么我的不一樣呢

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-02-26 20:15 by 海邊沫沫
    @haha
    我用的是Ubuntu 13.10中自帶的Eclipse 3.8.1
    我估計Ubuntu團隊對它的界面做了一點點改變,以便更符合Ubuntu的主題
    所以和別的系統中的Eclipse有點不一樣

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-03-14 13:23 by gaesar1
    老師,你好。我是個初學者。我的擴展點怎么建立不起來呢?運行后沒有顯示,而且我的擴展點也沒向你的那樣有那么多標簽選項,和下劃線鏈接。是不是我哪里設置不對啊?

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-03-14 20:35 by 海邊沫沫
    @gaesar1
    需要一點耐心,仔細做好每一個步驟。把Eclipse自帶的幾個RCP模板都生成一下,看一下每一個模板生成的程序有什么不同,是一個很好的起步手段。

    另外,可以看看我五年前的博文(向后翻幾頁就到,我的Blog文章不多)。那個時候寫的Hello World可能更詳細。

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-03-17 13:30 by gaesar1
    老師,我生成了幾個模板還是沒有頭緒。成了帶有一個視圖的helloRCP,為什我把原擴展的class和id均指向一個新的視圖時(perspectiveExtension也改了),運行還是提示原來的視圖無法創建呢?

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-09-27 23:28 by enjay
    最近看了你寫的Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示文章,知道你研究RCP時間比較長,我想請教一下,開發RCP時,兩個plug-in依賴時,為什么在eclipse中運行ok,而當發布出來時卻報如下錯誤:
    Could not create the view: Plug-in com.enjay.rcp.railway was unable to load class com.enjay.rcp.railway.home.HomeView.
    我寫的HomeView是繼承另一個plug-in的視圖。
    請指教,期待你的回復,謝謝

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-10-01 20:55 by 海邊沫沫
    @enjay
    你的問題就是很簡單的在發布的時候沒有把相應的plugin發布出來。
    所以在eclipse中運行OK,單獨運行時就找不到HomeView了。

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-12-26 10:32 by fenghuozhuan
    怎么能全部檔下來

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2014-12-26 10:32 by fenghuozhuan
    對了,寫的很好,很喜歡

    # re: Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡單展示  回復  更多評論   

    2015-08-15 12:53 by shaoalan
    很不錯,樓主用心了
    主站蜘蛛池模板: 99热亚洲色精品国产88| 亚洲国产成人精品电影| 国产精品亚洲а∨无码播放不卡 | 亚洲国产成人AV网站| 啦啦啦高清视频在线观看免费| 亚洲理论在线观看| av无码久久久久不卡免费网站| 亚洲成人一级电影| 免费观看成人毛片a片2008| 亚洲色www永久网站| 国产极品美女高潮抽搐免费网站| 亚洲国产精品美女久久久久| 日韩一级免费视频| 一区二区免费国产在线观看| 国产成人亚洲精品狼色在线| 另类免费视频一区二区在线观看| 老司机亚洲精品影院| 亚洲成在人线aⅴ免费毛片| 欧美亚洲精品一区二区| 亚洲精品网站在线观看不卡无广告| 亚洲免费无码在线| 亚洲视频2020| 毛片免费vip会员在线看| 国产亚洲午夜精品| 亚洲VA成无码人在线观看天堂| h片在线免费观看| 99亚洲精品卡2卡三卡4卡2卡| 亚洲美女高清一区二区三区 | 高清在线亚洲精品国产二区| eeuss免费天堂影院| 18亚洲男同志videos网站| 免费精品一区二区三区在线观看| 日韩大片免费观看视频播放| 久久国产亚洲电影天堂| 精品免费久久久久久成人影院| 久久国产一片免费观看| 亚洲制服丝袜第一页| 国产精品亚洲mnbav网站| 黄色永久免费网站| 一级毛片无遮挡免费全部| 亚洲成AV人片久久|