麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 編程設計 > 正文

eclipse rcp詳解Hello World以及eclipse rcp和osgi的簡單展示(圖文)

2020-06-27 15:30:39
字體:
來源:轉載
供稿:網友

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即可。
eclipse,rcp,osgi

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

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

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

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

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

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

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

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

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

eclipse,rcp,osgi

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

下一步,導出程序,如下圖:
eclipse,rcp,osgi

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

以上過程非常簡單,所以先秀圖片。下面,來看看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的時候,選擇如下圖中的單選框和填寫好根目錄:
eclipse,rcp,osgi
  就可以得到一個Repository,該Repository是供p2安裝程序使用的,里面沒有Native launcher。如下圖:
eclipse,rcp,osgi
  在這個目錄里面建立一個configuration文件夾,里面放一個config.ini,記住,在Linux系統下,configuration文件夾一定要是rwx權限的哦。config.ini文件內容如下:
eclipse,rcp,osgi
  該文件定義了OSGi啟動時安裝哪些Bundle,并且這些Bundle默認的啟動級別是多少。啟動級別的數字越小的越優先啟動。configuration/config.ini是OSGi啟動時默認的配置文件路徑,當然也可以使用-configuration選項更改為別的路徑。然后,如下命令啟動HelloWorld:
eclipse,rcp,osgi
  在指定啟動OSGi的jar文件時,我偷了點懶,為了少敲幾下鍵盤,使用了一個通配符,大家還是可以很輕松地看出來是哪個文件哦?Equinox的官方文檔在這里:http://eclipse.org/equinox/documents/quickstart-framework.php
  如果想按照Equinox的官方文檔啟動OSGi框架的命令行,還得從Eclipse的安裝目錄找到如下幾個文件:
eclipse,rcp,osgi

然后還需要這樣一個config.ini文件:

 

復制代碼
代碼如下:

<a href="mailto:osgi.bundles=./org.apache.felix.gogo.runtime_0.10.0.jar@start,/">osgi.bundles=./org.apache.felix.gogo.runtime_0.10.0.jar@start,/</a>
<a href="mailto:./org.apache.felix.gogo.command_0.12.0.jar@start,/">./org.apache.felix.gogo.command_0.12.0.jar@start,/</a>
<a href="mailto:./org.apache.felix.gogo.shell_0.10.0.jar@start,/">./org.apache.felix.gogo.shell_0.10.0.jar@start,/</a>
<a href="mailto:./org.eclipse.equinox.console_1.0.0.dist.jar@start,/">./org.eclipse.equinox.console_1.0.0.dist.jar@start,/</a>
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能為我們提供哪些服務。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产一国产精品一级毛片 | 99在线啪| 久久久久免费电影 | 92看片淫黄大片欧美看国产片 | 国产免费中文字幕 | 免费久久久 | 在线看免费观看av | 国产成人视屏 | 久久99精品久久久久久国产越南 | 成人一级黄色 | 国产精品久久久久久久成人午夜 | 欧美成人精品一区二区 | 9191色| www.com超碰| 中文字幕11 | 中国大陆一级毛片 | www.777含羞草 | v11av在线播放 | 中文字幕极速在线观看 | 亚洲欧洲日产v特级毛片 | 玖草| 精品成人久久久 | 亚洲精品一区二区三区在线看 | 九九热精品在线视频 | 日韩精品中文字幕在线播放 | 最新一级毛片 | 性日本xxx | 久久亚洲春色中文字幕久久 | 美女黄网站免费观看 | 国产精品av久久久久久久久久 | 一级大片在线观看 | 国产精品亚洲精品久久 | 久久嗨 | 黄色片网站免费观看 | 一级做a爱片性色毛片 | 一级黄色在线免费观看 | 一级免费大片 | 中文字幕在线免费看 | 国产精品久久久不卡 | 911精品影院在线观看 | 国产欧美一区二区三区免费看 |