文章詳情頁
在.NET平臺上運(yùn)行Java程序-IKVM.NET入門
瀏覽:8日期:2024-06-16 08:35:07
內(nèi)容: 可以自由轉(zhuǎn)載, 轉(zhuǎn)載請保留下面的作者信息和鏈接:作者 cleverpig(http://blog.matrix.org.cn/page/cleverpig)摘要IKVM.NET是一個(gè)針對Mono和微軟.net框架的java實(shí)現(xiàn),其設(shè)計(jì)目的是在.NET平臺上運(yùn)行java程序。本文將比較詳細(xì)的介紹這個(gè)工具的原理、使用入門(如何java應(yīng)用轉(zhuǎn)換為.NET應(yīng)用、如何在java中開發(fā).NET應(yīng)用),希望能給大家?guī)眢@喜。對此的疑問和討論,請關(guān)注cleverpig的blog:http://blog.matrix.org.cn/page/cleverpig一、介紹IKVM.NET是一個(gè)針對Mono和微軟.net框架的java實(shí)現(xiàn),其設(shè)計(jì)目的是在.NET平臺上運(yùn)行java程序。它包含了以下的組建:* 一個(gè)用.NET實(shí)現(xiàn)的java虛擬機(jī) * 一個(gè)java類庫的.NET實(shí)現(xiàn) * 致力于在java和.NET之間交互的工具 二、IKVM.NET的組件IKVM.NET包含以下的部分: * IKVM.Runtime.dll: VM運(yùn)行時(shí)和所有支持代碼。它包括以下的功能: Byte Code JIT 編譯器和驗(yàn)證器: 使用JIT將Java Byte Code編譯為CIL(C中間語言)。 對象模式映射結(jié)構(gòu): 將.NET中的System.Object,System.String,System.Exception映射為java代碼中的java.lang.Object, java.lang.String,java.lang.Throwable。 管理本地方法(在Classpath中)的.NET重新實(shí)現(xiàn)。 * IKVM.GNU.Classpath.dll: 被編譯的GNU Classpath版本,它是由自由軟件基金會實(shí)現(xiàn)的java類庫和一些IKVM.NET附加代碼組成的。注意:這里的GNU Classpath不是IKVM.NET的一部分,但是前者被用在IK.VM.NET中。 * IKVM.JNI.[Mono|CLR-Win32].dll: 通過實(shí)現(xiàn)JNI接口管理C++匯編。作為一個(gè)可選部分,只在程序使用自己的本地庫時(shí)才被用到。而對于純java程序來講是不會被用到的。 * ikvm.exe: 與java.exe很類似的啟動執(zhí)行程序(動態(tài)模式)。* ikvmc.exe: 靜態(tài)編譯器,被用來編譯java類和jar使其成為.NET匯編(靜態(tài)模式)。 * ikvmstub.exe: 一個(gè)從.NET匯編生成存根類的工具,就如javap一樣反編譯.NET匯編。IKVM.NET了解如何存根并用實(shí)際的.NET類型引用替換對存根的引用。 * IKVM.AWT.WinForms.dll: 非常有限的零散AWT實(shí)現(xiàn)。 二、項(xiàng)目狀態(tài)此項(xiàng)目目前正在開發(fā),將最大化實(shí)現(xiàn)與JDK1.4的兼容,但是仍存在一些漏洞(尤其在Classpth API中)。 * AWT和Swing還未有功能。 * 安全性是IKVM平臺的一個(gè)大遺漏。此問題將依靠.NET平臺提供的舊有的、但功能強(qiáng)大的安全模式而被解決。 雖然這樣,目前項(xiàng)目已具備能成功運(yùn)行大型java項(xiàng)目的能力。 三、IKVM原理1.如何替換JVM IKVM應(yīng)用包含了采用.NET實(shí)現(xiàn)的java虛擬機(jī)。在一些場合,我們可以用它替換掉java。例如: java -jar myapp.jar 將被替換為 ikvm -jar myapp.jar。2.在.NET應(yīng)用中使用java類庫IKVM.NET包含ikvmc,這個(gè)在java bytecode與.NET中間語言的轉(zhuǎn)換器。如果我們使用一個(gè)被用在.NET平臺的java庫的話, 運(yùn)行ikvmc –target:library mylib.jar(mylib.jar在這里指代我們的jar文件)來生成mylib.dll。例如apache FOP項(xiàng)目是一個(gè)開源的XSL-FO處理器項(xiàng)目,它使用java語言編寫的用于從xml生成PDF文檔。使用IKVM.NET技術(shù),我們可以將apache FOP用在任何的.NET應(yīng)用中。這樣在開發(fā).NET應(yīng)用的同時(shí)利用IKVM便可以使用java開源項(xiàng)目這個(gè)免費(fèi)的軟件倉庫。盡管在IKVM.NET沒有提供在.NET中使用的java編譯器,但是我們可用開源的Jikes編譯器將java源代碼編譯為JVM bytecode,然后使用ikvmc –target:exe myapp.jar來生產(chǎn).NET執(zhí)行文件。我們甚至可以通過包含ikvmstub應(yīng)用的方式在我們的java代碼中用.NET API。四、IKVM使用入門1.系統(tǒng)準(zhǔn)備Windows平臺:Microsoft .NET Framework 1.1 SDKWindows或者Linux平臺:Mono Framework 1.02.開始安裝在Windows和Linux平臺上安裝過程是相同的,在下載二進(jìn)制發(fā)布版后,將文件解壓縮。打開命令或者shell窗口,cd進(jìn)入ikvmbin目錄,執(zhí)行ikvm。如果我們操作正確的話,我們將看到以下的輸出:usage: ikvm [-options] [args...] (to execute a class) or ikvm -jar [-options] [args...] (to execute a jar file) ...為了方便使用,我們可將ikvmbin目錄加入到系統(tǒng)path?,F(xiàn)在我們將使用IKVM就像使用JVM一樣,并不需要配置。如果我們需要在.NET或者M(jìn)ono環(huán)境下使用IKVM,請仔細(xì)閱讀下面的文字說明:* 首先下載Jikes編譯器。如果我們計(jì)劃開發(fā)在java中開發(fā)代碼 運(yùn)行于.NET環(huán)境的話,我們將要一個(gè)java編譯器。IKVM.NET沒有提供這個(gè)編譯器,所以我們需要能生成標(biāo)準(zhǔn)java類文件的編譯器。Jlikes是一個(gè)好選擇,它是一個(gè)優(yōu)秀的開源項(xiàng)目,并應(yīng)用在多種平臺。當(dāng)然Sun提供的jdk也很好。* 在Windows的全局匯編緩沖區(qū)中安裝IKVM dll。在Windows中運(yùn)行基于IKVM dll的.NET應(yīng)用程序時(shí),.NET框架必須定位這些dll的位置。系統(tǒng)首先在全局匯編緩沖區(qū)中查找,然后再當(dāng)前目錄中查找。如果我們想不在當(dāng)前目錄中安裝這些dll文件的話,我們就要將它們安裝在全局匯編緩沖區(qū)中:在Windows控制面板中訪問.NET框架配置,增加一個(gè)匯編緩沖區(qū)。我們至少要安裝IKVM.GNU.Classpath.dll和IKVM.Runtime.dll。3.設(shè)置環(huán)境在我們開始編寫代碼之前需要準(zhǔn)備一下我們的環(huán)境,添加以下路徑到系統(tǒng)PATH環(huán)境變量中:* 包含IKVM執(zhí)行文件的目錄。* 包含C#編譯器(在Windows/Mono中為csc)的目錄,通常在Windows中為C:WINDOWSMicrosoft.NETFrameworkv1.1.4322。* 包含java編譯器(javac或者jikes)的目錄。4.動態(tài)執(zhí)行java應(yīng)用程序IKVM.NET包括了一個(gè)C#實(shí)現(xiàn)的java虛擬機(jī)。我們可以從一個(gè)例子開始——進(jìn)入IKVMROOTsampleshello目錄,編譯示例程序:Javac Hello jar cfm hello.jar manifest.mf Hello.class現(xiàn)在,在使用javac編譯了Hello類后,我們使用IKVM運(yùn)行此類:ikvm Hello 這個(gè)命令將啟動IKVM,IKVM查找名為Hello.class的文件。如果找到,則將其裝載并動態(tài)執(zhí)行bytecode。此時(shí)Hello程序?qū)⒁笪覀冚斎朊?,之后我們將看到一個(gè)問候信息。如果在上面的過程中發(fā)生問題,請檢查下面的地方:* 檢查命令行: ikvm像java一樣需要我們輸入正確的類名。* 如果ikvm報(bào)告ClassNotFoundException,請檢查CLASSPATH環(huán)境變量是否被設(shè)置。如果被設(shè)置,請清除CLASSPATH或者將當(dāng)前目錄加入到CLASSPATH中以使ikvm能夠在當(dāng)前目錄中找到類。如果運(yùn)行jar文件,我們可鍵入:ikvm -jar hello.jar 提示:詳細(xì)的命令行選項(xiàng)可以參考ikvm手冊。5.將java程序轉(zhuǎn)換為.NET程序IKVM.NET包含ikvmc這個(gè)能夠?qū)ar文件轉(zhuǎn)換為.NET的dll庫文件和exe應(yīng)用的工具。下面我們將學(xué)習(xí)如何將java應(yīng)用轉(zhuǎn)換為一個(gè).NET執(zhí)行文件:進(jìn)入IKVMROOTsampleshello目錄輸入以下命令:ikvmc hello.jar 注意:當(dāng)我們使用Mono時(shí),我們需要告訴ikvmc如何找到GNU Classpath dll,例如:ikvmc -reference:/usr/lib/IKVM.GNU.Classpath.dll hello.jar 在命令執(zhí)行完后,我們將發(fā)現(xiàn)hello.exe已被生成在當(dāng)前目錄:* 在Windows/.NET環(huán)境下,如果我們得到了FileNotFound的異常,請記住檢查.NET框架希望在當(dāng)前目錄或是全局匯編緩沖區(qū)中尋找dll文件。我們可以通過上面講的方法將dll安裝到全局匯編緩沖區(qū)中,或者將dll文件直接復(fù)制到當(dāng)前目錄。* 在Linux/Mono環(huán)境下,我們使用下面的命令執(zhí)行hello.exe:mono hello.exe6.在java中開發(fā).NET應(yīng)用首先進(jìn)入IKVMROOTsamplesusenetapi目錄,找到ShowDir.java文件,這個(gè)java應(yīng)用使用了.NET API來顯示當(dāng)前目錄下的文件列表。打開這個(gè)文件,我們會發(fā)現(xiàn)其導(dǎo)入的包名以cli開頭,這些并不是java API包,它們是映射到.NET命名空間的“偽包。需要查看更多信息請看IKVM的開發(fā)者手冊。第一步:生成java存根文件IKVM沒有提供java編譯器,所以我們可以使用標(biāo)準(zhǔn)的java編譯器。由于java編譯器只能編譯使用了java API的應(yīng)用程序,而不是使用.NET API的應(yīng)用。所以我們在這里需要“愚弄一下java編譯器使其相信名為cli.System.IO的包是一個(gè)真正的java包。幫助我們完成這項(xiàng)工作的是ikvmstub程序。它從.NET dll生成jar文件,這個(gè)被生成的jar文件包含了與.NET類對應(yīng)的java類和接口,但是并不包含真正的代碼,只包含一些映射信息。這樣做便會通過java編譯器的檢查和編譯:ikvmstub mscorlib.dll注意:在Linux Mono環(huán)境下,我們必須輸入dll文件的完整路徑,例如:ikvmstub /usr/lib/mscorlib.dll在編譯完成后,我們將在當(dāng)前目錄下發(fā)現(xiàn)一個(gè)名為mscorlib.jar的文件。第二步:編譯java源代碼現(xiàn)在我們將編譯java源代碼,如果使用javac的話,可輸入以下命令:javac -classpath mscorlib.jar ShowDir.java在命令完成后,ShowDir.class文件將出現(xiàn)當(dāng)前目錄下。第三步:生成.NET執(zhí)行文件最后我們將轉(zhuǎn)換java class文件為.NET應(yīng)用程序,正如前面講的:ikvmc ShowDir.class注意:在Linux Mono環(huán)境下,我們需要使用前面提到的-reference選項(xiàng):ikvmc -reference:/usr/lib/IKVM.GNU.Classpath.dll ShowDir.class這時(shí)我們便可以看到ShowDir.exe出現(xiàn)在當(dāng)前目錄。五、參考資源:http://www.ikvm.net/ Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 可以自?
標(biāo)簽:
Java
上一條:JavaMail API詳解下一條:Java中的國際化,第二部分
相關(guān)文章:
1. Java程序員應(yīng)該知道的10個(gè)調(diào)試技巧2. PHP采集程序中常用的函數(shù)3. Java程序員可能犯的3個(gè)常見SQL錯誤4. 如何編寫python的daemon程序5. IBM發(fā)布AUS: 消除你Java程序中脆弱的API6. 《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記三:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法分析7. PHP程序員的學(xué)習(xí)技術(shù)成長規(guī)劃8. 提升JSP應(yīng)用程序的七大絕招9. 微信小程序?qū)崿F(xiàn)商品分類頁過程結(jié)束10. python實(shí)現(xiàn)音樂播放和下載小程序功能
排行榜
