程式者的胡言亂語

pageicon 星期四 八月 10, 2006

深入敵營的Java Part II


在上述視窗的命令列中,我輸入的是:


\ikvm-0.28.0.0\bin\ikvm -cp lucene-core-2.0.0.jar;lucene-demos-2.0.0.jar org.apache.lucene.demo.IndexFiles docDir


其中\ikvm-0.28.0.0\bin\ikvmIKVM.NETVM啟動程式,我透過-cp這個選項來設定要執行應用程式的classpath,而我執行的類別正是Lucene demo程式中的org.apache.lucene.demo.IndexFiles,它接收命令列引數傳入的目錄路徑,並且為其中的檔案建立全文搜尋的索引。從這個例子來看,我們完全可以在不更動現有Java應用程式的情況下,在.NET上,透過IKVM.NET執行起來。



接著,我在命令列輸入searchfiles,代表要執行SearchFiles.exe,我分別輸入” tautology””reduplication”,以及”either”三個字進行全文的查詢。而它所查詢的,正是適才執行的Java程式所建立的索引檔。SearchFiles.exe原先是lucene-demos-2.0.0.jar中的Java類別,但我利用IKVM.NET所提供的工具,將它先轉換成為.NET上的執行檔SearchFiles.exe,這麼一來,這個SearchFiles.exe便可以直接於.NET上執行。


所以,何必這麼辛苦呢?Java真的是一次編寫,隨處運行呀,用Java版的Lucene不就成了。稍後,我會在C#程式中直接使用這裡所轉換得到的lucene.dll,這暗示或明示了.NET程式包括ASP.NETVB.NET,都可以直接使用Java世界的Lucene,毋需任何額外的移植心力。


IKVM.NET的作者


看到了IKVM.NET的簡單火力展示,相信多少會有點心動了吧。這一切都要感謝IKVM.NET的作者Jeroen Frijters,以及其開發團隊的貢獻。Jeroen Frijtersjeroen@frijters.net保持了一個好習慣也就是利用他的bloghttp://weblog.ikvm.net/),記錄他開發IKVM.NET的點點滴滴,包括對技術觀點的思考以及心路歷程。倘若一路追溯其blog上的文章,也能循原路一路追蹤IKVM.NET的發展歷史。



Jeroen Frijters


 


下載,安裝,及設定


那麼,要如何取得IKVM.NET呢?IKVM.NET已經是SourceForge上的一個專案。只要到這個網址,即可很容易的找到下載處。


http://sourceforge.net/projects/ikvm/


下載.zip檔,並且將它解開至某個目錄(例如c:\ ikvm-0.28.0.0)即可。基本上,什麼設定都不需要做,所有的執行檔以及執行所需的.DLL都在解開主目錄的bin子目錄中。只要裝有Microsoft .NET Framework 1.1 SDKMono Framework 1.0都可以執行IKVM.NET


但由於IKVM.NET執行時會需要一些.DLL,這麼一來,在不同目錄執行IKVM.NET時,得將這些.DLL複製的到處都是。如果想偷懶或避免麻煩的話,可以將相關的DLL安裝於Global Assembly Cache中。這會使得.NET平台無論在任何目錄執行,都能找到這些.DLL。怎麼將安裝DLL安裝於Global Assembly Cache中呢?在Windows上,請從「控制台」出發,選擇 [系統管理工具]/[Microsoft .NET Framework 1.1組態],再從樹狀檢視中選擇[我的電腦]/[組件快取],即可輕易的將DLL加入Global Assembly Cache。那麼,要加入那些DLL呢?最少你得將IKVM.GNU.Classpath.dllIKVM.Runtime.dll加入,這兩個DLL及其餘DLL的用途,我接著馬上說明。


重要組成


IKVM.NETbin目錄下,可以看到有數個DLL以及EXE檔,它們都是IKVM.NET的重要組成,包括:


l          IKVM.Runtime.dll


l          IKVM.GNU.Classpath.dll


l          IKVM.JNI.CLR-Win32.dll


l          IKVM.AWT.WinForms.dll


l          ikvm.exe


l          ikvmc.exe


l          ikvmstub.exe


IKVM.Runtime.dll提供了IKVM.NET本身VMruntime所需以及其他輔助程式碼,例如Byte Code JIT compiler/verifierObject model remapping infrastructure、以及針對GNU Classpath中的原生部份所撰寫的.NET實作。


IKVM.GNU.Classpath.dll便是GNU Classpath的已編譯版本,你可以把它視為.NET版本的Java核心程式庫。IKVM.JNI.CLR-Win32.dll是實作JNI介面的Managed C++ assembly,它並非執行IKVM.NET的必需品,倘若你執行的是純Java應用程式,沒有動用到JNI,那麼就不需要動用到它。事實上,IKVM.NET還提供另一個名為IKVM.JNI.Mono.dll的檔案,它與IKVM.JNI.CLR-Win32.dll的作用是相當的,只不過IKVM.JNI.Mono.dll是提供Mono平台上的IKVM.NET使用。IKVM.AWT.WinForms.dllIKVM.NETAWT peers實作。由於作者認為這一塊(AWT/SWING)對他本人來說是優先序較低的一塊,所以他自己也承認目前的實作情況並不佳。


IKVM.NET提供了三個執行檔。ikvm.exeIKVM.NETVM啟動程式,相當於我們在JDKJRE中十分熟悉的java.exe,作用相同,也就是啟動JVM,並且執行所指定類別的main()。當我們使用動態的應用模式時,便會使用到ikvm.exe


ikvmc.exe這個工具則是用來將.class.jar檔編譯成為.NET assembly,這裡所指涉的.NET assembly包括:EXE檔(作為console 或視窗應用程式),DLL檔(作為library),以及.netmodule(做為.NET上的模組)。在靜態應用模式中,便會使用到這一個工具。


ikvmstub.exe則能針對指定的Assembly,產生相對應的jar檔,此jar檔中內含Java版本的interfacesstub類別。其目的在於為.NET類別提供Java版本的介面(stub類別),以便讓Java應用程式呼叫.NET類別。


 



如上圖所示,ikvmstub.exe會產生介面和.NET類別一模一樣的Stub類別,而這個Stub類別是Java類別,那麼我們所撰寫的Java類別便可以透過呼叫Stub類別,進而達成呼叫.NET類別的目的。

迴響:

發表迴響:
迴響功能已被關閉
把對母乳媽媽的感謝與支持傳出去

« 九月 2010
星期日星期一星期二星期三星期四星期五星期六
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  
       
今日

Search this blog

Links

Weblog menu

Today's referrers

Feeds