程式者的胡言亂語

pageicon 星期一 八月 14, 2006

深入敵營的Java Part III

相容性及支援性


整個IKVM.NET的目標是希望和JDK 1.4相容目前的情況是JDK 1.4大部份的API都已支援(感謝GNU Classpath,這部份是由GNU Classpath所加持),但正如前文所提及的,對AWTSWING的支援還十分不足。此外,就是Java安全性的機制尚未建構出於.NET上的版本。


GNU Classpath幾乎決定了IKVM.NETJDK的支援程度。那麼我們該如何知道GNU ClasspathJDK 1.4的支援程度呢?有個名為”japitool”的專案(http://www.kaffe.org/~stuart/japi/),所提供的工具可以協助我們了解。這個工具是Java API相容性測試的工具組,當初發展的動機是為了測試自由的(FREEJava實作對Sun JDK的相容性。不過,後來也被用來測試任意版本API的回溯相容性。下圖是japitools網站上列出GNU ClasspathJDK 1.4的比較:



支援程度以綠至紅的色譜來示,綠色代表正面,而紅色代表負面。可以看的出來,大部份我們所習慣的API,幾乎都支援的相當完善。



而上圖則為GNU ClasspathJDK 1.5的比較,可以看的出來,紅色的部份就比較多了,以此圖為例,java.util.concurrent的這個package,可以說是沒有支援。這當然是因為GNU Classpath仍舊在持續發展中的關係。


每個人或每個開發團隊對API支援程度的需求都不盡相同。對我而言,有沒有支援到所有的API倒不是這麼重要,但對某些人來說,也許完整性是很大的考量。不論如何,GNU Classpath的成長愈趨成熟,這點倒不值得過於擔心。


使用IKVM.NET的工具


IKVM.NET提供三個執行檔:ikvm.exeikvmc.exe,以及ikvmstub.exe。其使用方式以下則分別說明。


IKVM.NET Virtual Machine


ikvm.exe正是IKVM.NET的虛擬機器的啟動程式。它就跟java.exe的作用相當。它的使用方式是:


ikvm [ options ] classname [ args ... ]


ikvm [ options ] -jar jarfile [ args ... ]


options只有一個選項,就是-classpath。所以只需指定classpath及欲執行的class名稱就可以了。


IKVM.NET Bytecode Compiler


ikvmc.exeIKVM.NETbyte code compiler,它的作用在於「靜態」的,以「離線」的方式,將Java classes(以.class.jar形式)轉換成為.NET上的assembly.NET上的assembly可以是.exe(執行檔),.dll(程式庫),或.module.netmodule)。所轉換出來的.NET assembly,可直接於.NET上執行,或由.NET的其他程式呼叫。它的使用方式是:


ikvmc [ options ] classOrJarfile [ classOrJarfile ... ]


可用的選項就多了,包括:


l          -out:outputfile


l          -assembly:assembly-name


l          -target:target-type


l          -main:classname


l          -reference:library-filespec


其中-target即是用來指定欲將Java classes轉換成為那類型的.NET assembly。共有四種選擇:


l          -target:exe:用來產生console應用程式。


l          -target:winexe:用來產生視窗應用程式。


l          -target:library:用來產生程式庫。


l          -target:module:用來產生.netmodule


當欲產生的是console應用程式或視窗應用程式時,必須指定究竟那個Javaclass才是主要的class。因為.exe檔只會有單一的入口點,當我們在編譯目的為可執行檔的.NET應用程式時,你會發現只允許其中一個class具備Main(),也就是程式的入口點,這是很合理的。因為執行.exe時,不提供入口點的選擇。但Javajar檔或classpath中的classes,是允許多個classes具備main()的,所以在轉換為.NET可執行檔時,必須指定究竟那個class的才是具備入口點的class


之前我有示範過將Lucene轉換至.NET,讓我們來看一個使用ikvmc.exe的例子,將Lucene的核心轉換成為.NET的版本:


ikvmc -out:lucene.dll -target:library lucene-core-2.0.0.jar


只要這麼一行,我們就可以得到一個叫做lucene.dll.NET library,其內容皆是介面和lucene-core-2.0.0.jar中的Java classes介面相同的.NET classes。而這個.NET library可以提供給任何.NET應用程式使用,甚至包括VB.NETASP.NET


讓我們繼續轉換的動作:


ikvmc -out:SearchFiles.exe -target:exe


-reference:lucene.dll


-main:org.apache.lucene.demo.SearchFiles


我們在這個轉換動作中,將Lucene提供的範例程式中,名為org.apache.lucene.demo.SearchFiles的類別,轉換成為.NET上的可執行檔。由於它會使用到Lucene的核心API,所以我們必須透過-reference這個選項,讓它在轉換過程中得以參考lucene.dll的內容,確保這些API都的確存在。否則的話,ikvmc.exe會給你一些警告訊息,你得在runtime確定被警告不存在的API都的確會存在。


IKVM.NET Stub Generator


ikvmstub.exe是用來產生讓Java應用程式呼叫.NET類別之stub類別的程式。它的使用方式是這樣的:


ikvmstub assemblyNameOrPath


倘若我們要在Java應用程式中呼叫.NET類別時,就可以利用這個工具,先產生.NET類別相對應的Java stub classes,將這些classes置於classpath中,接著便可以利用ikvm.exe啟動你的Java應用程式,在Java應用程式中便可以透過呼叫stub class的方式來間接的呼叫相對應的.NET class。例如,在.NET核心程式庫中有個類別,它是System.Net.Sockets.TcpClient,主要用來建立TCP連線。我們執行下述的命令:


ikvm-0.28.0.0\bin\ikvmstub


C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll


其中System.dll.NET中用來提供這個class的程式庫檔案。


當我們這樣執行後,便可以在執行目錄下找到一個名為System.jar的檔案,裡頭就是System.dll中所有classJava stub版。讓我們試著解開System.jar,可以看到它的目錄結構應如下圖:



你可以看到,TcpClient.class就出現在System\Net\Sockets目錄下,它就是System.Net.Sockets.TcpClientJava stub class。日後,只要呼叫這個Java stub class中的methodstub class就會進一步呼叫.NET版本的真正實作。另一個要注意的是,IKVM.NET會為轉換出來的.NET類別其namespace前冠上cli,以資區別。

迴響:

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

« 九月 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