在很多的大型系統開發中,開發工具往往不限制於同一種開發語言,而是會使用多種開發語言的混合型開發。目前Java和.Net都聲稱自己占85%的市場份額,不管誰對誰錯,Java和.Net是目前應用開發的兩個主要陣營,所以Java.和Net之間的整合是大型應用開發過程中經常會面臨一個問題。
目前Java和.Net之間的整合主要有三種思路和做法(經過幾天的查閱,目前我就看到了這三種方式,可能還有其他的方法):
1)基於通訊協議的整合
基於通訊協議的整合方式,最容易被人首先想到,簡單的方式可以通過Web Service來實現,但是效率問題,在某些場合之下將會成為一個致命傷。使用Remote進行分布式開發,可以提高通信的效率,好消息是:Java和.Net都很好的支持Remoting遠程對象調用的分布式開發;壞消息是:他們同時存在一個弊端,那就是對開發語言的限制,無論是使用哪一種通訊方式,服務器與客戶端都必須支持同一種開發語言。對此,各大開發公司做出了積極的貢獻,開發出如J-Integra(又名Ja.NET),IIOP.NET(Internet Inter-Orb Protocol),JNBridge等集成開發工具,對.NET與JAVA之間實現Remote遠程對象的相互調用作出足夠的支持。在這些產品中推薦選用:JNBridge
JNBridge是一種領先的JAVA與.NET互操作的的產品,憑借JNBridge技術,Java和.NET代碼無需交叉編譯器就可以實現對象共享。所有Java代碼運行在JVM上,而.NET代碼則運行在CLR上。在該方案下,JVM和CLR可以運行在不同的機器上,也可以運行在一台機器的不同進程上,甚至還能運行在相同的進程的不同應用程序域上。經歷多年的發展,JNBridge已經發布了JNBridgePro 5.0,JNBridgePro 5.0有着更強大的功能。
1.支持ava和.NET之間的跨平台事務;
2.支持Microsoft Visual Studio和Eclipse插件;
3.兼容Windows 7;
4.跨平台交易一體化主要是對用戶透明;
5.'回滾'- 任何一方的終止都將導致雙方的行動被回滾;
JNBridge支持.NET To Java ,Java To .NET兩種服務方式,並可以行用TCP、HTTP、SOAP等多個協議進行雙方通訊。
參考資源:
官網地址:
2)基於用.Net實現Java虛機的整合
目前可以選用的開源資源主要是:IKVM.NET。
IKVM.NET的是開源的基於.NET CLR 的Java虛擬機。基於.NET的Java虛擬機意味着我們可以讓Java程序跑在.NET上,可以通過虛擬機這個中介讓Java程序和.NET應用程序一起協同工作。更難能可貴的是,IKVM同時支持微軟的.NET Framework 和 Mono。
安全性是IKVM平台的一個大遺漏。此問題將依靠.NET平台提供的舊有的、但功能強大的安全模式而被解決。 雖然這樣,目前項目已具備能成功運行大型java項目的能力。
IKVM目前不成熟的地方在以下幾個方面:
1.對AWT和Swing沒有提供支持,在IKVM的開發計划中,這項優先級別不高。
2.對Java的安全模型沒有實現。
參考資源:
《Using Java Classes in your .NET Application》
http://www.codeproject.com/Articles/13549/Using-Java-Classes-in-your-NET-Application
3)基於java的本地接口的整合
Java本地接口(Java Native Interface (JNI))允許運行在Java虛擬機(Java Virtual Machine (JVM))上的代碼調用本地程序和類庫,或者被它們調用,這些程序和類庫可以是其它語言編寫的,比如C、C++或者匯編語言。
參考資源:
《Using the Java Native Interface in C#》
http://www.codeproject.com/Articles/245622/Using-the-Java-Native-Interface-in-Csharp
綜述
選用JNBride,比較適合大型項目的開發,在雙方互調上支持的非常好,而且雙方可以互相不用感知。但是不管怎么樣,信息傳輸上需要一定的開銷(如果對於效率要求非常高的情況下,這方面多少有些損失)。
選用IKVM.NET,在.Net調用Java上可以做到“無縫”,如果不考慮Java調.Net(好像Java調用.Net的Dll沒有.Net Call Java那么麻煩),個人感覺一般情況下還是首選(畢竟它目前的不足,一般的情況下影響不是太大,也很少有機會涉及到)。
基於JNI的整合方式,由於對Java不太了解,不好過多評論,不過曾看到一句這樣的描述:使用本地方法是有開銷的,它喪失了java的很多好處。如果別無選擇,我們可以選擇使用本地方法。不管怎么樣,從別人文章的描訴:“In my example, I will show you how to call a couple of Java methods from a C# client.”,可以看出從實現上,完全可以做到.Net調用Java方法。
以上的綜述,均為個人淺顯的理解,這幾天僅僅從全局上考慮如何“Call Java Method From .Net”,對於這三種方式的Demo並沒有按照別人的介紹去調試和性能測試,僅僅先從大的方向和思路上做一些前期研究。下一步,打算把1,2種方式的Demo進一步研究和比較一下,第3種方式,目前暫時定性位了解吧。